1
我有以下语法:为什么ANTLR不会“过度减少”这个表达式?
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步中出现wherin解析器将shift
一个null
到堆栈的前提reduce
荷兰国际集团的因素“ up“为expr
。
当ANTLR严格“要求”时,ANTLR是否只转换null
,因为生成的reduce
将满足语法?
难道不是递归下降自顶向下的解析方法?我认为ANT ** LR **生成自下而上的LR解析器? –
(我的困惑是,当我阅读关于** LR **的文章时,我直接采用自下而上的方法,比如当我阅读关于递归下降的转换 - 减少文件时,我将自定义为自上而下的解析方法) –
好的,我是一个完全白痴,需要阅读ANTLR参考。它产生一个LL解析器! –