在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'
'本地人[]'的範圍是一個單一的規則。 'returns []'使用相同的語法,但這些聲明對於調用規則是可見的。請注意,既然自動生成的監聽器ams訪問接口可用於語法本身與其他特定於語言的邏輯的分離,那麼這兩種方法都不再適用於ANTLR 4。 –
@ 280Z28:我沒有看到任何提及聽衆的武器。你能給我一些文件嗎? – Kevin
我的意思是聽衆*和*訪問者,但我搞砸了或在我的手機上。對於那個很抱歉。 –