我有一個簡單的語法:ANTLR AST規則失敗,RewriteEmptyStreamException
grammar sample;
options { output = AST; }
assignment
: IDENT ':=' expr ';'
;
expr
: factor ('*' factor)*
;
factor
: primary ('+' primary)*
;
primary
: NUM
| '(' expr ')'
;
IDENT : ('a'..'z')+ ;
NUM : ('0'..'9')+ ;
WS : (' '|'\n'|'\t'|'\r')+ {$channel=HIDDEN;} ;
現在我想添加一些重寫規則生成AST。從我在線閱讀和語言模式書中,我應該能夠修改語法如下:
assignment
: IDENT ':=' expr ';' -> ^(':=' IDENT expr)
;
expr
: factor ('*' factor)* -> ^('*' factor+)
;
factor
: primary ('+' primary)* -> ^('+' primary+)
;
primary
: NUM
| '(' expr ')' -> ^(expr)
;
但它不起作用。雖然它編譯得很好,但當我運行解析器時,我得到一個RewriteEmptyStreamException錯誤。這是事情變得奇怪的地方。
如果我定義僞令牌ADD和MULT並使用它們代替樹節點文字,它將正常工作。
tokens { ADD; MULT; }
expr
: factor ('*' factor)* -> ^(MULT factor+)
;
factor
: primary ('+' primary)* -> ^(ADD primary+)
;
或者,如果我使用節點後綴符號,它也顯得做工精細:
expr
: factor ('*'^ factor)*
;
factor
: primary ('+'^ primary)*
;
這種差異的行爲的錯誤嗎?
感謝ton @JoelPM。這正是我所期待的。評估時,我們遇到了深層嵌套樹和堆棧溢出的問題。這使我們有機會生成一棵N-tree樹並大幅減少樹的深度 – 2016-11-30 15:07:51