我有以下语法:
expr : factor op ;
op
: '+' factor op
| // Blank rule for left-recursion elimination
;
factor
: NUM
| '(' expr ')'
;
NUM : ('0'..'9')+ ;
我提供2 + 3
,使用expr
作为开始规则。来自ANTLR的结果解析树是正确的;但是,我认为我误解了它使用的shift-reduce方法。
我希望以下情况发生:
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
因素的先决条件&#34 ;最多"到expr
。
ANTLR只会严格按null
{"}"因为结果reduce
会满足语法吗?