2013-10-12 151 views
0

ANTLR: Is there a simple example?,關於antlr3問題,接受的答案有這樣的語法:添加自定義屬性,以規則

grammar Exp; 

eval returns [double value] 
    : exp=additionExp {$value = $exp.value;} 
    ; 

additionExp returns [double value] 
    : m1=multiplyExp  {$value = $m1.value;} 
     ('+' m2=multiplyExp {$value += $m2.value;} 
     | '-' m2=multiplyExp {$value -= $m2.value;} 
     )* 
    ; 

multiplyExp returns [double value] 
    : a1=atomExp  {$value = $a1.value;} 
     ('*' a2=atomExp {$value *= $a2.value;} 
     | '/' a2=atomExp {$value /= $a2.value;} 
     )* 
    ; 

atomExp returns [double value] 
    : n=Number    {$value = Double.parseDouble($n.text);} 
    | '(' exp=additionExp ')' {$value = $exp.value;} 
    ; 

Number 
    : ('0'..'9')+ ('.' ('0'..'9')+)? 
    ; 

WS 
    : (' ' | '\t' | '\r'| '\n') {$channel=HIDDEN;} 

它使用$value屬性傳遞信息分析樹。

我想做同樣的事情antlr4。它看起來像$value屬性不存在了。我如何將自定義屬性添加到規則以將信息傳遞到分析樹上?如果這不是實現我想要的正確機制,那麼有什麼機制來完成類似的事情?


我試着用當地人,像這樣:

/* Store each row in an ArrayList */ 
row 
    locals [ 
    ArrayList<String> cells = null 
    ] 
    : partial_row RowSeparator 
    { 
    $cells = $partial_row.cells; 
    } 
    ; 

partial_row 
    locals [ 
    ArrayList<String> cells = null 
    ] 
    : Cell 
    { 
    $cells = new java.util.ArrayList<String>(); 
    $cells.add($Cell.text); 
    } 
    | partial_row Cell 
    { 
    $cells = $partial_row.cells; 
    $cells.add($Cell.text); 
    } 
    ; 

但是,這並不正常工作,給我這個錯誤:

error(65): csce322a1p2.g:70:24: unknown attribute 'cells' for rule 'partial_row' in '$partial_row.cells' 
+0

'本地人[]'的範圍是一個單一的規則。 'returns []'使用相同的語法,但這些聲明對於調用規則是可見的。請注意,既然自動生成的監聽器ams訪問接口可用於語法本身與其他特定於語言的邏輯的分離,那麼這兩種方法都不再適用於ANTLR 4。 –

+0

@ 280Z28:我沒有看到任何提及聽衆的武器。你能給我一些文件嗎? – Kevin

+0

我的意思是聽衆*和*訪問者,但我搞砸了或在我的手機上。對於那個很抱歉。 –

回答

0

相反的locals,我想用@initreturns

row returns [java.util.ArrayList<String> cells] 
    @init { 
    java.util.ArrayList<String> cells = null; 
    } 
    : partial_row RowSeparator 
    { 
    $cells = $partial_row.cells; 
    } 
    ; 

partial_row returns [java.util.ArrayListArrayList<String> cells] 
    @init { 
    java.util.ArrayListArrayList<String> cells = null; 
    } 
    : Cell 
    { 
    $cells = new java.util.ArrayList<String>(); 
    $cells.add($Cell.text); 
    } 
    | partial_row Cell 
    { 
    $cells = $partial_row.cells; 
    $cells.add($Cell.text); 
    } 
    ; 
0

我認爲你正在尋找「返回」而不是當地人。此外,這應該工作。我的測試工作:

行 當地人[ ArrayList的細胞= NULL ] :A B {$ 細胞= $ A; } ;