带参数的Antlr规则

带参数的Antlr规则,antlr,Antlr,我正在与ANTLR规则参数斗争。ANTLR版本是4.4 grammar A; DIGIT: [0-9]; s: val EOF; val: dval[1] | val '*' val; dval[int x]: '.'; ANTLR在以下情况下失败: error(50): :2:32: syntax error: '1' came as a complete surprise to me while looking for rule element /Users/parrt/antlr/c

我正在与ANTLR规则参数斗争。ANTLR版本是4.4

grammar A;
DIGIT: [0-9];
s: val EOF;
val: dval[1] | val '*' val;
dval[int  x]: '.';
ANTLR在以下情况下失败:

error(50): :2:32: syntax error: '1' came as a complete surprise to me while looking for rule element 
/Users/parrt/antlr/code/antlr4/tool/src/org/antlr/v4/parse/GrammarTreeVisitor.g: node from after line 2:10 no viable alternative at input 'dval<tokenIndex=22>' 
/Users/parrt/antlr/code/antlr4/tool/src/org/antlr/v4/parse/GrammarTreeVisitor.g: node from after line 2:10 no viable alternative at input 'dval<tokenIndex=22>' 
/Users/parrt/antlr/code/antlr4/tool/src/org/antlr/v4/parse/GrammarTreeVisitor.g: node from after line 2:10 no viable alternative at input 'dval<tokenIndex=22>'

ANTLR不支持规则定义中的参数

解析器规则由一组lexer规则或解析器规则组成,请参阅

不是有效的规则

建议 是一本关于ANTLR的好书。
另外,这也是学习ANTLR语法的一个很好的参考。

ANTLR允许使用规则参数,但它们的工作方式与我猜想的不一样。这是你语法的修订版(我对你的意图有点猜测)。另外,请注意:这只是使用规则的
返回
注释。 (有关传递参数的更完整答案,请参阅)

通过此操作运行输入
89*10
,将生成树
(val 89*10)

返回[int value]
部分只是将
值添加到
ValContext
中。这为您提供了一个变量,用于在调用侦听器时放置计算值(覆盖
void exitVal(AParser.ValContext ctx);
方法

public静态类ValContext扩展了ParserRuleContext{
公共价值观;
public List INT(){return getTokens(AParser.INT);}
公共终端节点INT(INT i){
返回getToken(AParser.INT,i);
}
public ValContext(ParserRuleContext父级,int invokingState){
super(父级,调用状态);
}
@重写公共int getRuleIndex(){return RULE_val;}
@凌驾
public void enterRule(ParseTreeListener侦听器){
if(AListener的侦听器实例)((AListener)listener.enterVal(this);
}
@凌驾
public void exitRule(ParseTreeListener侦听器){
if(AListener的侦听器实例)((AListener)listener.exitVal(this);
}
}

这在第7章“注释解析树”一节中的权威ANTLR参考中有详细说明。另请参阅第15章中的“规则属性定义”(如果您打算大量使用ANTLR,这本书非常容易理解,是一本非常宝贵的参考书)

你怎么能看到错误?你运行了什么antlr编译器命令?@daneel-s-yaitskov你对此有什么更新吗?
grammar A;
DIGIT: [0-9];
s: val EOF;
val: dval | val '*' val;
dval: '.';
dval[int  x]: '.';
grammar A;

s: val EOF;
val returns [int value]: INT | INT '*' INT;
fragment DIGIT: [0-9];
INT: DIGIT+;
WS: [ \t\n] -> skip;