Я использую бизона и столкнулся с конфликтом сдвига / уменьшения. Зубр определил один сдвиг / уменьшить конфликт. Я не могу найти неоднозначность в этом языке:
start
: IDENT trailer EQUAL atom trailer SEMICOLON
| atom trailer SEMICOLON
;
atom
: LPAR atom trailer RPAR
| IDENT
;
trailer
: %empty
| LPAR RPAR
;
Эта проблема также описана в документации по грамматике python внизу. Я могу устранить неоднозначность, используя решение, описанное в этой документации (измените строку 2 на atom trialer EQUAL atom trailer SEMICOLON
.
Теперь, когда это исправлено, я могу двигаться дальше, но мне все еще любопытно, что это за проблема. Пожалуйста, опишите мне проблему с грамматикой выше и приведите пример предложения на языке, который имеет два уникальных дерева разбора.
РЕДАКТ. 1
После дальнейшего изучения, у следующего есть конфликт сдвига / уменьшения:
start
: IDENT LPAR RPAR EQUAL atom LPAR RPAR SEMICOLON
| atom LPAR RPAR SEMICOLON
;
atom
: IDENT
;
но здесь нет конфликта сдвига / уменьшения:
start
: IDENT LPAR RPAR EQUAL IDENT LPAR RPAR SEMICOLON
| IDENT LPAR RPAR SEMICOLON
;
Это кажется мне очень подозрительным, потому что в первой грамматике атом вынужден производить ИДЕНТ, поэтому эти две грамматики по сути одинаковы. Мне все еще понадобятся некоторые объяснения.