2011-07-11 47 views
6

我有一個語法,我想在其中包含多參數函數(如f(x,y))。我使用AST輸出和我自己的樹分析器。現在我的參數列表生產用於定義/調用多參數函數的ANTLR語法

paramdefs: (ID COMMA)* ID ; 

這工作得很好,但AST輸出

z(x,y)=expression 

(FUNC (z)(x)(,)(y)(expression)) 

(即它是非常平坦的)。

FUNC CommonTree的孩子,在一般情況下,都是{function nameparametercommaparameterdefined expression},對於任何數量的參數。我希望參數列表是一個單獨的孩子,而不是逗號(這會使樹更容易走路)。

理想的情況下,這是樹會是什麼樣子:

(FUNC (z)((x)(y))(expression)) 

(請注意沒有逗號元素和xy分組

相關相關的語法方面:

funcdef: ID '(' paramdefs ')' '=' expr -> ^(FUNC ID paramdefs expr) ; 

paramdefs: (ID COMMA)* ID ; 

回答

8

要創建這樣的樹:

enter image description here

爲輸入z(x,y)=expr,請執行下列操作:

grammar ... 

... 

tokens { 
    FUNC; 
    PARAMS; 
} 

... 

funcdef 
    : ID '(' paramdefs ')' '=' expr -> ^(FUNC ID paramdefs expr) 
    ; 

paramdefs 
    : (ID COMMA)* ID     -> ^(PARAMS ID+) 
    ; 
+0

謝謝 - 那偉大工程! – CajunLuke

+0

@CajunLuke,不客氣。 –