2014-02-13 100 views
2

我是ANTLR的新手。我開始探索ANTLR教程。我已經看到了返回類型被定義爲特定規則的例子(見下面的例子)。ANTLR:帶參數的規則?

我可以將參數傳遞給規則嗎?在我的腦海裏,我只是想要根據提供給它的論點,在規則的狀態下改變規則的行爲。

請幫助我,如果它在ANTLR中可以通過,或者這是一個好主意嗎?

atom returns [int value] 
: 
    INT 
    { 
     $value = Integer.parseInt($INT.text); 
    } 
    | ID // variable reference 
    { 
     Integer v = (Integer) memory.get($ID.text); 
     if (v != null) 
     $value = v.intValue(); 
    } 
; 

回答

6

是的,但你不能傳遞從語法分析規則爲詞法規則參數:詞法分析器獨立於解析器構建令牌。

的規則參數的例子:

parse 
: p1["param"] 
; 

p1 [String s] 
: ref=p2[$s, 42] 
    { 
    // Print some info about rule 'p2'. 
    System.out.println("param=" + $s); 
    System.out.println("p2.ss=" + $ref.ss); 
    System.out.println("p2.ii=" + $ref.ii); 
    } 
; 

// Rules can have more than 1 param, and can even return more than 1 value. 
p2 [String s, int i] returns [String ss, int ii] 
: ID 
    { 
    $ss = $s + "_" + $ID.text; 
    $ii = $i + $i; 
    } 
; 

ID 
: ('a'..'z')+ 
; 

如果你現在想分析輸入"mu",以下將被打印到控制檯:

param=param 
p2.ss=param_mu 
p2.ii=84 
+0

請記住,每次使用的這功能將使轉換到ANTLR 4更加困難,在語法中用戶指定的參數和返回值的使用充其量是「不鼓勵」。 –