ANTLR4 - 是否可以在匹配规则中存储特定数据类型的变量?

ANTLR4 - Is it possible to store a variable of a certain data type within a matched rule?

我想以某种方式在匹配的规则中存储一个预先确定的类型(甚至是一个对象)的变量,就像在 GNU Bison 中一样,您可以在其中定义每个规则具有的类型以及构造函数以及与之关联的字段。

例如(在 GNU Bison 中),如果我预先确定 varAssign 规则的实例将是类型 TokenVarAssign,它有一个构造函数和两个字段(变量标识符和赋值表达式),我可以执行以下操作:

varAssign: id '=' expr {$$ = new TokenVarAssign(); $$.id = ; $$.expr = ;}

其中$$表示当前匹配的token(本例中为varAssign之一)和$ n 表示规则中的第 n 个标记。

是否有可能实现与 ANTLR4 相同(或类似)的效果。 到目前为止,在解析文件并以这种方式构建我的 Token 对象之后,我一直在遍历 ParserRuleContext 个对象的树,结果证明它的多态性和动态性要低得多。

编辑以响应答案: 使用以下语法文件,我得到以下错误:

grammar Test ;

INT: '0' .. '9' ;
add [int x] returns [int result] : '+=' INT {$result = $x + $INT.int;} ;

错误:

$ antlr4 Test.g4
error(50): Test.g4:4:4: syntax error: '[int x]' came as a complete surprise to me while matching rule preamble

您可以定义和分配 attributes on parse tree nodes。您可以访问访问者和语法文件中的属性。