0
我想使用ANTLR(使用手寫遊客代碼,而不是ANTLR的樹語法。)出示我可以手動走的AST說我有以下的語法如何指定ANTLR AST節點類型?
expr : term ((PLUS | MINUS)^ term)*;
term : factor ((MULT | DIV)^ factor)* ;
factor : NUMBER
我想這兩個expr
和term
生成當節點類型爲BinaryExpression
的AST節點當且僅當存在運算符(正,負,時間或除法)匹配時,否則產生一個普通的NUMBER
。我知道我可以附加一個像$type = "BINARYEXPRESSION"
這樣的動作,但這看起來像是一種黑客行爲。有更好的方法嗎?是否使用ANTLR爲手動遍歷樹生成解析器是一個壞主意?
編輯:
我已經試過
expr : term ((PLUS<BinaryExpression> | MINUS<BinaryExpression>)^ term)*;
但是)這似乎並沒有帶任何效果(產生的節點仍然CommonTree和CommonToken的情況下),和b)爲了節省重複,我希望這種類型被應用到由給定規則構造的整個節點,而不是將類型應用到當前規則的子節點。即我不應該把<Identifier>
放在標識符爲兒童的每個規則中。
是的,我知道這種語法,但我似乎無法讓它適合我的目的。請參閱編輯以進行澄清。 – int3