2013-08-14 5 views
0

Я хотел бы узнать, как решить перевод грамматики в LL (1). У меня следующий вопрос:LL (1) оператор грамматики и индексирования []

E -> E + E 
E -> E * E 
E -> E[ E ] 
E -> int 
E -> id 

Что касается операторов «+» и «*» Я знаю, что решение:

E -> TA 
A -> + TA 
A -> epsilon 

T -> FB 
B -> * FB 
B -> epsilon 

проблема, что делать с оператором индексации в то время как в то же время мы должны избежать рекурсии?

Кто-нибудь знает решение?

Спасибо.

+0

Простой: сделайте его постфиксным оператором и примените ** правую ** рекурсию, вот как это делает грамматика C89. –

+0

Почему вы думаете, что это отличается от случаев, когда вы знаете, как обращаться? – rici

+0

Ну, если я, как и другие один: 'F -> GC C -> [E] C C -> эпсилон G -> идентификатор G -> int' Я думал, что я не буду тот же результат. Но теперь это похоже на рабочее решение. Как вы думаете? –

ответ

1

(Повышенные из комментария):

На основе предложенного решения для арифметических операторов:

E -> T A 
A -> + T A 
A -> epsilon 

T -> F B 
B -> * F B 
B -> epsilon 

Мы можем добавить почти аналогично:

F -> G C 
F -> int 
C -> [ E ] C 
C -> epsilon 

И закончить с:

G -> id 
G -> (E) 

Выражение в скобках в последней строке не было в исходной проблеме, но кажется разумным добавить его. Строка F отличается от двух других тем, что она отвергает индексированные выражения целых литералов (например, 3[x]), хотя это может быть разрешено целевым языком (допустимо, например, C), и в этом случае следует заменить F -> int с оригиналом G -> int.

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