У меня есть следующая грамматика:
expr : factor op ;
op
: '+' factor op
| // Blank rule for left-recursion elimination
;
factor
: NUM
| '(' expr ')'
;
NUM : ('0'..'9')+ ;
Я задаю 2 + 3
, используя expr
в качестве начального правила. Результирующее дерево синтаксического анализа от ANTLR правильное; однако я думаю, что неправильно понимаю методы сдвига-уменьшения, которые он использует.
Я ожидаю, что произойдет следующее:
Step # | Parse Stack | Lookahead | Unscanned | Action
1 | | NUM | + 3 | Shift
2 | NUM | + | 3 | Reduce by factor -> NUM
3 | factor | + | 3 | Shift a 'null'?
4 | factor null | + | 3 | Reduce by op -> null
5 | factor op | + | 3 | Reduce by expr -> factor op
6 | expr | + | 3 | Shift
7 | expr + | NUM | | Shift
8 | expr + NUM | | | Reduce by factor -> NUM
9 | expr + factor | | | ERROR (no production)
Я ожидал, что на шаге 3 произойдет ошибка, когда синтаксический анализатор shift
поместит в стек null
в качестве предварительного условия для reduce
увеличения коэффициента до expr
.
Сдвигает ли ANTLR null
только тогда, когда это строго «требуется», потому что результирующий reduce
будет удовлетворять грамматике?