添加自定义属性,以规则
问题描述:
在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'
答
相反的locals
,我想用@init
和returns
:
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);
}
;
答
我认为你正在寻找“返回”而不是当地人。此外,这应该工作。我的测试工作:
行 当地人[ ArrayList的细胞= NULL ] :A B {$ 细胞= $ A; } ;
'本地人[]'的范围是一个单一的规则。 'returns []'使用相同的语法,但这些声明对于调用规则是可见的。请注意,既然自动生成的监听器ams访问接口可用于语法本身与其他特定于语言的逻辑的分离,那么这两种方法都不再适用于ANTLR 4。 –
@ 280Z28:我没有看到任何提及听众的武器。你能给我一些文件吗? – Kevin
我的意思是听众*和*访问者,但我搞砸了或在我的手机上。对于那个很抱歉。 –