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解析器! –