嵌入式操作中的 ANTLR4 规则和令牌属性

ANTLR4 Rule and Token attributes in embedded actions

在 The Definitive ANTLR4 Reference 一书中,有两个短语涉及从嵌入式操作访问规则和令牌属性

短语 1(第 272 页令牌属性):$T 和 $l 计算令牌名称 T 和令牌标签 l 的令牌对象。 $ll 对列表标签 ll 的计算结果为 List。

短语 2(第 273 页解析器规则属性):$r 和 $rl 计算规则名称 r 和规则标签 rl 的 RContext 类型的 ParserRuleContext 对象。 $rll 对规则列表标签 rll

的计算结果为 List

我不明白是什么部分

"$ll 对列表标签 ll 计算为 List"

"$rll 计算规则列表标签 rll 的列表"

平均值。

能否请您举例说明并告诉我如何使用它?

提前致谢

是的,这在书中有点误导。有令牌列表是什么意思。我假设有一个包含 ll 的示例,但后来没有出现在印刷书中。

你可以有这样的东西:

list: ll += ID (ll += ID)*;

注意 +=,ANTLR 将其转换为标记列表(而不是用于简单赋值的单个标记)。然后,您可以像使用您的语言的任何其他列表一样访问它(例如,$ll[1].text 用于第二个元素的文本)。

请注意,还有另一种情况 ANTLR 会自动生成列表,即当您在 alt 中多次引用 token/rule 时:

list: ID COMMA ID;

当您现在想在监听器中访问 ID 时,您会看到实际上有一个列表,这样您就可以访问所有出现的事件。