我有一个语法,我自己构建树。规则如下:
literal returns [ExpressionSyntax value]
: exp1=NULL { $value = new IdentifierSyntax(exp1.Text); }
| exp2=booleanLiteral { $value = new ValueSyntax(exp2.value, TypeCode.Boolean); }
这构建了一个完整的树,最后一个表达式返回了我需要的内容。
问题是Antlr本身也在构建TreeAdaptor
的树。我如何禁用它?我已经尝试用一个什么都不做的替换树适配器(即返回null
,即使在Create
方法上),我仍然得到一个有效的结果(它的速度要快得多),所以我知道Antlr不依赖于此。但是,我想从生成的代码中完全删除adaptor
代码。我的语法是C#,但据我所知,这不应该有所作为。
答案 0 :(得分:1)
在ANTLR 3中,无法在运行时启用或禁用树构造。当且仅当语法包含output=AST
选项时才会创建树。
如果您手动构建树,那么您的语法应省略output=AST
选项。
注意:如果您在语法中的任何位置使用AST运算符output=AST
或^
,或者如果一个,!
选项会自动应用于您的语法或更多解析器规则包含使用->
运算符的重写规则。如果您不想使用output=AST
选项并且看到警告149,那么您需要查看语法并删除这些运算符的任何实例,因为它们在没有output=AST
选项的情况下毫无意义。< / p>