Первоначально в примере была этазубр сдвиг/свертка проблему перемещения добавить цит в subexpr
expr:
INTEGER
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
;
Я хотел, чтобы быть «более простой», так что я написал это (я понимаю, что это будет делать «+» как для добавления, так и для вычитания. Но это пример)
expr:
INTEGER
| expr addOp expr { $$ = $1 + $3; }
;
addOp:
'+' { $$ = $1; }
| '-' { $$ = $1; }
;
Теперь я получаю ошибку сдвига/уменьшения. Это должно быть то же самое -_- (для меня). Что мне нужно сделать, чтобы исправить это?
Редактировать: Чтобы все было ясно. В первом случае нет предупреждений/ошибок. Я использую% left, чтобы установить приоритет (и я буду использовать% right for = и другие права ops). Однако, похоже, это не применяется при переходе в подвыражения.
Shift/уменьшить конфликты являются нормальными, но это правило, которое является одновременно левым и правым рекурсивным не соответствует Yacc парсеру конструкцию скважины и является излишне сложным.Если вы оставите его рекурсивным, он будет работать лучше и не будет конфликтов. См. 'Q4.y' ниже. – DigitalRoss
Как вторая заметка, ваша вторая версия не делает то, что вы думаете. Он вернет «4» для «2 - 2». –
Кроме того, '{$$ = $ 1; } 'rule неявно - вам нужно только выписать правила, если это что-то другое. –