2016-12-09 2 views
0

Я новичок в Bison и у меня возникают проблемы с конфликтов сдвиг/свёртка ...Конфликт Bison анализатор

Я пишу правила грамматики для языка C: ID является маркер, который идентифицирует переменной, и я написал это правило, чтобы убедиться, что идентификатор можно рассмотреть, даже если он записан в круглых скобках.

id    : '(' ID ')' {printf("(ID) %s\n", $2);} 
       |  ID  {printf("ID %s\n", $1);} 
       ; 

Выход конфликтов зубра:

State 82 

    12 id: '(' ID . ')' 
    13 | ID . 

    ')' shift, and go to state 22 

    ')'  [reduce using rule 13 (id)] 
    $default reduce using rule 13 (id) 

Как разрешить этот конфликт?

Надеюсь, я был прост и благодарен вам за помощь.

+0

Разве это весь выход бизона? Кроме того, можете ли вы предоставить его на английском языке? – melpomene

+0

исправьте на английском –

+2

Даже для грамматик нам нужен [минимальный, полный и проверенный пример] (/ help/mcve). –

ответ

0

Ваше правило id само по себе не может вызвать ошибку сдвига/уменьшения. В вашей грамматике должно быть какое-то другое правило, которое использует ID. Например, у вас есть правило выражение, такие как:

expr: '(' expr ')' 
    | ID 
    ; 

В приведенном выше примере, ID может свести к id или expr и анализатор не знает, какое сокращение брать. Проверьте, что находится в состоянии 22.


Edit: « , что я могу сделать, чтобы решить конфликт» вы спросите

Я пишу правила грамматики для языка C: ID является маркером, который идентифицирует переменную, и я написал это правило, чтобы гарантировать, что идентификатор можно считать даже если написано в скобках

переменной в круглых скобках в качестве левой стороны недопустим в C, так это может произойти только в правой части. Тогда вы можете считать это выражением, поэтому просто удалите свое правило и где вы используете id, замените его на expr.

+0

Вы правы. У меня есть правило этого типа, и если я прокомментирую это, у меня больше нет конфликтов. на этом этапе, как я могу это сделать? –

+0

См. Редактирование моего решения. Если это вам поможет, нажмите на нуль между стрелками вверх/вниз слева, чтобы принять решение. –

+0

Ваш ответ лучший. В C, однако, грамматически разрешено делать (A) = (b), учитывая, что компиляция не имеет ошибок. Но я приму решение. Спасибо –

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