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

时间:2015-04-18 10:33:40

标签: java parsing antlr4

我想以某种方式在匹配的规则中存储预定类型(甚至是对象)的变量,就像在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

1 个答案:

答案 0 :(得分:1)

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