Bison: сдвиг / уменьшение разрешения конфликтов при работе с необязательными правилами

В грамматике файла .y (yacc - bison) я определил следующие правила:

C : E | D | F | A

A : B | B '[' C ']' ;

(это что-то вроде B с необязательным [C]), когда я компилирую файл .y соответствующим образом, используя правильный файл лексера, я получаю следующий конфликт сдвига \ уменьшения:

Состояние 48
74 A: B.
75 | Б. '[' C ']'
'[' shift и перейти в состояние 91
'[' [уменьшить с помощью правила 74 (A)]
$ по умолчанию уменьшить с помощью правила 74 (A)

Моя проблема заключается в следующем, если у него есть предшественник '[' Я хочу, чтобы он сдвигался, а не уменьшался. Проблема в том, что я не могу найти решение этой ошибки при поиске часов в документации. Как я могу это исправить (просьба указать конкретный код).


person John Sig    schedule 25.03.2016    source источник
comment
Вы не предоставили достаточно информации для воспроизведения вашей ошибки. Когда я создаю файл bison из вашего примера, я не нахожу проблем. Покажите, пожалуйста, еще код, воспроизводящий вашу ошибку.   -  person Brian Tompsett - 汤莱恩    schedule 26.03.2016


Ответы (2)


Проблема в том, что существует некоторый контекст, в котором за A может следовать [. Не зная больше грамматики, невозможно быть более точным.

Однако стоит отметить, что bison / yacc сделает именно то, что вы хотите: разрешит конфликт в пользу сдвига. Так что, если не считать предупреждения, все должно быть в порядке.

person rici    schedule 25.03.2016

Если вы попытаетесь расширить правило A, вы получите два возможных состояния

Состояние 1:

A -> B

Состояние 2:

A -> B
A -> BC

Все возможные состояния для A следующие

A -> B (State 1)
A -> B (State 2)
A -> BC

Bison не может определить, находитесь ли вы в состоянии 1 или 2 для входа B.

Вы можете заменить правило A (при условии, что B и C - токены):

A: B | B C
person bipe15    schedule 27.03.2016