Antlr 用[]重写树

Antlr 用[]重写树,antlr,antlr3,Antlr,Antlr3,我试图重写AST并输出语义警告。 如果我将[]与lexer规则一起使用,它接受但不接受解析器规则,为什么? 我有一个名为“var”的解析器规则,如果通过以下方式声明,我将测试该值: -> ^(DECLARATION TYPE var[Main.symbols.test_declared($var.text)] expression?); 但我得到: unexpected token: Main.symbols.test_declared($var.text) 有没有办法绕过这个问题 我

我试图重写AST并输出语义警告。 如果我将[]与lexer规则一起使用,它接受但不接受解析器规则,为什么? 我有一个名为“var”的解析器规则,如果通过以下方式声明,我将测试该值:

-> ^(DECLARATION TYPE var[Main.symbols.test_declared($var.text)] expression?);
但我得到:

unexpected token: Main.symbols.test_declared($var.text)
有没有办法绕过这个问题


我看过的大多数教程都只使用LEXER规则,但我不能基于我的语法,例如IDENTIFIER是var的一部分。

在ANTLR 3中,
var[xxx]
语法意味着将
xxx
作为参数传递给
var
规则。如果这不是你想要做的,你需要明确你的目标是什么。在重写规则(在
->
操作符的右侧)中,
var
规则已经完成,因此参数没有意义。您可以仅使用
var
引用结果:

-> ^(DECLARATION TYPE var expression?);

我想传递参数来检查符号表中是否已经声明了var,并可能在树中打印输出。如果我尝试使用lexer规则“IDENTIFIER”而不是“var”,它会起作用。我不明白为什么?我的问题对吗?这是我试图实现的代码片段。但是这里使用的“VAR”是一个LEXER规则。因为我遵循这个示例,所以我使用了“var”,它是一个解析器规则,因此会给出错误^('='VAR exp)->^('='VAR[Compile.symbolTable.lookupStaticName($VAR.text)]exp)