#syntax #bison #bnf
#синтаксис #bison #bnf
Вопрос:
Я пишу нотацию bnf с помощью Jison и получаю конфликт уменьшения / уменьшения:
Conflict at state: 26, token: SIMPLE_ASSIGN
reduce by rule: PrimaryExpression -> Identifier
reduce by rule: LeftHandSideExpression -> Identifier
Мое состояние 26 выглядит следующим образом:
item set 24
AssignmentExpression -> LeftHandSideExpression .AssignmentOperator AssignmentExpression
AssignmentOperator -> .SIMPLE_ASSIGN
AssignmentOperator -> .COMPLEX_ASSIGN
transitions -> {"AssignmentOperator":61,"SIMPLE_ASSIGN":62,"COMPLEX_ASSIGN":63}
item set 25
LogicalORExpression -> LogicalANDExpression .
LogicalANDExpression -> LogicalANDExpression .LOGICAL_AND EqualityExpression
transitions -> {"LOGICAL_AND":64}
item set 26
LeftHandSideExpression -> Identifier .
PrimaryExpression -> Identifier .
transitions -> {}
item set 27
LogicalANDExpression -> EqualityExpression .
EqualityExpression -> EqualityExpression .EQUALITY_OPERATOR RelationalExpression
transitions -> {"EQUALITY_OPERATOR":65}
Как мне выяснить проблему здесь и исправить ее?
Я использую Jison, и я запускаю: jison -p lalr -t grammer/noa.bnf -t > log
Интересно, что я также использую syntax-cli
, который не приводит к конфликту уменьшения / уменьшения, но все еще имеет проблемы с синтаксическим анализом.
Комментарии:
1. Ваш вопрос должен включать вашу грамматику (или, в идеале, сокращенную версию, которая показывает ту же проблему). И «возникли проблемы с синтаксическим анализом» — не очень полезное описание проблемы (хотя я понимаю, что вы не спрашиваете о syntax-cli).
Ответ №1:
Это говорит вам о том, что существует некоторое грамматическое производство, в котором за нетерминальным PrimaryExpression
(или некоторым нетерминальным, расширение которого заканчивается PrimaryExpression
) может следовать a SIMPLE_ASSIGN
(или какой-то нетерминальный, расширение которого начинается с SIMPLE_ASSIGN
, хотя это кажется маловероятным). В этом контексте Identifier
(расширение которого не показано) неоднозначно, потому что оба PrimaryExpression
и LeftHandSideExpression
могут расширяться до Identifier
.
Трудно догадаться, какой это может быть контекст, но его должно быть достаточно просто отследить: просто посмотрите на каждый нетерминал, который может предшествовать SIMPLE_ASSIGN
, пока не найдете тот, который может заканчиваться PrimaryExpression
. (Однако не все такие произведения являются ошибками. Это действительно сильно зависит от грамматики.)