2013-01-03 68 views
0

我想使用ANTLR(使用手寫遊客代碼,而不是ANTLR的樹語法。)出示我可以手動走的AST說我有以下的語法如何指定ANTLR AST節點類型?

expr : term ((PLUS | MINUS)^ term)*; 

term : factor ((MULT | DIV)^ factor)* ; 

factor : NUMBER 

我想這兩個exprterm生成當節點類型爲BinaryExpression的AST節點當且僅當存在運算符(正,負,時間或除法)匹配時,否則產生一個普通的NUMBER。我知道我可以附加一個像$type = "BINARYEXPRESSION"這樣的動作,但這看起來像是一種黑客行爲。有更好的方法嗎?是否使用ANTLR爲手動遍歷樹生成解析器是一個壞主意?

編輯:

我已經試過

expr : term ((PLUS<BinaryExpression> | MINUS<BinaryExpression>)^ term)*; 

但是)這似乎並沒有帶任何效果(產生的節點仍然CommonTree和CommonToken的情況下),和b)爲了節省重複,我希望這種類型被應用到由給定規則構造的整個節點,而不是將類型應用到當前規則的子節點。即我不應該把<Identifier>放在標識符爲兒童的每個規則中。

回答

0

典型的語法是Terminal<ASTNodeType>(點擊以供參考),但因爲它看起來你使用Python的目標,你必須驗證這一點。

+0

是的,我知道這種語法,但我似乎無法讓它適合我的目的。請參閱編輯以進行澄清。 – int3