2015-04-13 2 views
2

мне было дано задание, чтобы преобразовать эту грамматику LL (1)Почему это не грамматика LL (1)

E → E+E | E-E | E*E | E/E | E^E | -E | (E)| id | num 

Так что для первого шага я устранен двусмысленность и получил это:

E → E+T | E-T | T 
T → T*P | T/P | P 
P → P^F | F 
F → id | num | -E | (E) 

и после этого я устранили левую рекурсию и получил это:

E → TE' 
E' → +TE' | -TE' | ɛ 
T → PT' 
T' → *PT' | /PT' | ɛ 
P → FP' 
P' → ^FP' | ɛ 
F → id | num | -E | (E) 

Когда я это в JFLAP и нажмите кнопку «построить LL (1) синтаксический table 'Я получаю предупреждение, что грамматика выше не LL (1).

Почему эта грамматика не LL (1), и что мне нужно изменить, чтобы быть LL (1).

ответ

3

Ваша грамматика по-прежнему неоднозначна, поэтому она не может быть LL (1).

Эта постановка F → -E позволяет смешивать выражение с операторами младшего приоритета на уровне (унарный оператор), где они не должны отображаться.

Отметьте, что id + - id + id имеет два дерева деривации.

Здесь не следует использовать E, но это символ, представляющий атомное значение. Вы можете заменить

F → id | num | -E | (E) 

с

F → -A | A 
A → id | num | (E) 

F → -F | A Или, если вы хотите, чтобы несколько одинарных минусов.

+0

Или 'F → id | num | -F | (E) ', если вы не хотите вводить еще один нетерминал –

+0

Спасибо за ответ. Я представляю новый терминальный символ, как вы, и он работает сейчас. – clzola

Смежные вопросы