如何在Antlr中禁用树构造?

时间:2013-11-16 19:14:41

标签: c# antlr antlr3

我有一个语法,我自己构建树。规则如下:

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#,但据我所知,这不应该有所作为。

1 个答案:

答案 0 :(得分:1)

在ANTLR 3中,无法在运行时启用或禁用树构造。当且仅当语法包含output=AST选项时才会创建树。

如果您手动构建树,那么您的语法应省略output=AST选项。

注意:如果您在语法中的任何位置使用AST运算符output=AST^,或者如果一个,!选项会自动应用于您的语法或更多解析器规则包含使用->运算符的重写规则。如果您不想使用output=AST选项并且看到警告149,那么您需要查看语法并删除这些运算符的任何实例,因为它们在没有output=AST选项的情况下毫无意义。< / p>