我想以某种方式在匹配的规则中存储预定类型(甚至是对象)的变量,就像在GNU Bison中一样,您将在其中定义每个规则具有的类型,因此构造函数和字段与他们联系。
例如(在GNU Bison中),如果我预先确定 varAssign 规则的实例是TokenVarAssign
类型,它有一个构造函数和两个字段(变量标识符和赋值)表达式),我可以做到以下几点:
varAssign: id '=' expr {$$ = new TokenVarAssign(); $$.id = $1; $$.expr = $3;}
$$ 表示匹配的当前令牌(在本例中为 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