【发布时间】:2013-10-12 23:35:02
【问题描述】:
在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[]的范围为单个规则。returns[]使用相同的语法,但这些声明将对调用规则可见。请注意,由于自动生成的监听器 ams 访问者接口可用于将语法本身与其他特定于语言的逻辑分离,因此在 ANTLR 4 中不再推荐使用这些方法。 -
@280Z28:我还没有看到任何关于听众手臂的提及。你能给我一些他们的文件吗?
-
我的意思是听众和访问者,但我在打字或手机上搞砸了。对此感到抱歉。