Рассмотрим следующую (по общему признанию бессмысленную — она была значительно упрощена, чтобы проиллюстрировать суть) грамматику:
negationExpression
: TOK_MINUS constantExpression %prec UNARYOP
| testRule
;
constantExpression
: TOK_INTEGER_CONSTANT
| TOK_FLOAT_CONSTANT
;
testRule
: negationExpression constantExpression // call this Rule 1
| constantExpression // Rule 2
;
Bison не жалуется на конфликт редукции/редукции при работе с этой грамматикой, но мне кажется, что он есть. Предположим, мы проанализировали negationExpression
и constantExpression
; мне кажется, что парсер теперь может делать две вещи, основываясь на приведенном выше определении:
- Сократите последовательность до
testRule
, используя Правило 1 выше. - Сократите
constantExpression
доtestRule
, используя Правило 2 выше (в этом случаеnegationExpression
останется нетронутым, поэтому стек синтаксического анализа будет выглядеть так:negationExpression testRule
)
Однако никаких предупреждений не выдается, и когда я смотрю на файл .output, который генерирует Bison, кажется, что нет никакой двусмысленности:
state 5
6 testRule: constantExpression .
$default reduce using rule 6 (testRule)
...
state 9
5 testRule: negationExpression constantExpression .
$default reduce using rule 5 (testRule)
Согласно документам Bison:
Конфликт уменьшения/уменьшения возникает, если есть два или более правил, которые применяются к одной и той же последовательности ввода.
Здесь точно не так?