Я активно работаю с грамматиками Bison в первый раз. У меня установлена моя грамматика и небольшой набор тестов для корреляции результатов.Периодически проходит грамматика Bison, изредка терпит неудачу
Иногда набор тестов проходит:
Reducing stack by rule 101 (line 613):
$1 = nterm mathenv()
-> $$ = nterm closedTerm()
Stack now 0 5 3
Entering state 120
Reading a token: Next token is token ENDMATH()
Reducing stack by rule 28 (line 517):
$1 = nterm closedTerm()
-> $$ = nterm compoundTerm()
Stack now 0 5 3
Entering state 119
Reducing stack by rule 12 (line 333):
$1 = nterm compoundTerm()
-> $$ = nterm compoundTermList()
Stack now 0 5 3
Entering state 198
Next token is token ENDMATH()
Shifting token ENDMATH()
Entering state 325
... continues to completion ...
Иногда он не делает:
Reducing stack by rule 101 (line 613):
$1 = nterm mathenv()
-> $$ = nterm closedTerm()
Stack now 0 5 3
Entering state 120
Reading a token: Next token is token MN()
Reducing stack by rule 28 (line 517):
$1 = nterm closedTerm()
-> $$ = nterm compoundTerm()
Stack now 0 5 3
Entering state 119
Reducing stack by rule 12 (line 333):
$1 = nterm compoundTerm()
-> $$ = nterm compoundTermList()
Stack now 0 5 3
Entering state 198
Next token is token MN()
Shifting token MN()
Entering state 11
... errors eventually ...
Now at end of input.
Line: 9 Error: syntax error at token
ENDMATH
правильный маркер для перехода к, но иногда, MN
определяется. Я получаю несогласованные результаты, когда я запускаю свой тест. Является ли такая «случайная» двусмысленность нормальной? Что может быть причиной? Должен ли я определять некоторые правила %precedence
?
В верхней части y.output, я вижу несколько конфликтов для государств, как
State 0 conflicts: 3 shift/reduce
State 120 conflicts: 2 shift/reduce
State 127 conflicts: 2 shift/reduce
State 129 conflicts: 2 shift/reduce
State 154 conflicts: 1 shift/reduce
State 207 conflicts: 3 shift/reduce
State 265 conflicts: 109 shift/reduce
State 266 conflicts: 109 shift/reduce
State 267 conflicts: 109 shift/reduce
State 268 conflicts: 109 shift/reduce
State 269 conflicts: 109 shift/reduce
State 342 conflicts: 2 shift/reduce
State 390 conflicts: 109 shift/reduce
State 391 conflicts: 109 shift/reduce
State 396 conflicts: 1 shift/reduce
State 397 conflicts: 1 shift/reduce
Целесообразно исключить все эти конфликты? Обратите внимание, что состояние 120 указано как имеющее конфликт и является правилом состояния перед этой случайной ошибкой.
Лексер определяет, какие маркеры распознаются - парсер просто использует эти жетоны. Если вы получаете несогласованные токены из своего лексера, это проблема с лексером, и парсер не имеет значения. –