2016-12-11 3 views
0

, чтобы решить оборванную еще проблему, я использовал следующее решение:Бизон петли для конфликта

stmt   : stmt_matched 
       | stmt_unmatched 
       ; 
stmt_unmatched : IF '(' exp ')' stmt 
       | IF '(' exp ')' stmt_matched ELSE stmt_unmatched 
       ; 
stmt_matched : IF '(' exp ')' stmt_matched ELSE stmt_matched 
       | stmt_for 
       | ... 
       ; 

Для определения правил грамматики про цикл, я произвести сдвиг конфликта/уменьшение в связи с одной и теми же задачами :

stmt_for  : FOR '(' exp ';' exp ';' exp ')' stmt 
      ; 

Как я могу решить эту проблему?

ответ

0

Не все for утверждения сопоставлены. Рассмотрим, например

if (c) for (;;) if (d) ; else ; 

Поэтому необходимо разделить for заявления на for_matched и for_unmatched. (И аналогично с другими составными утверждениями, такими как while.)

+0

Так что я должен добавить for_matched в stmt соответствие и for_unmatched в stmt непревзойденный? Соответственно stmt_for_matched: ЗА '(' ехр ';' ехр ';' ехр ')' stmt_matched \t \t \t и stmt_for_unmatched: ЗА '(' ехр ';' ехр ';' ехр ')' stmt_unmatched \t \t \t; –

+0

@grazia: это правильно. – rici