Как мне отладить ошибку уменьшения / уменьшения в моей нотации bnf в Jison

#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 . (Однако не все такие произведения являются ошибками. Это действительно сильно зависит от грамматики.)