13

我正在为我的解析器规则使用返回值,它适用于除第一个之外的所有解析器规则。如果我的语法中的第一个解析器规则使用返回声明 ANTLR4 抱怨如下:

匹配规则时期望 ARG_ACTION

如果我在上面添加另一个不使用“返回”的解析器规则,ANTLR 不会抱怨。

在这里,您将语法简化为问题:

grammar FirstParserRuleReturnIssue;
ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
aRule returns [String s]: ID { $s = $ID.text; };

我搜索了第一条规则的一个特殊角色,它可以解释这种行为,但没有找到任何东西。它是一个错误吗?我错过了一些理解吗?

4

1 回答 1

14

您需要在语法中的词法分析器规则(以大写字母开头)之前放置解析器规则(以小写字母开头)。遇到词法分析器规则后,[触发 aLEXER_CHAR_SET而不是ARG_ACTION,因此编译器看到的令牌流看起来就像您正在传递一组字符,返回值应该是。

于 2013-05-10T20:56:51.300 回答