ANTLR4 解析树简化

标签 antlr antlr4

有没有办法让 ANTLR4 自动删除生成的解析树中的冗余节点?

更具体地说,我一直在试验 GLSL 语法,由于自动处理运算符优先级所需的规则转发,您最终会在解析树中得到很长的“表达式”线性序列。

大多数生成的树节点只是“前进到下一个优先级”,所以不要提供任何有用的句法信息——你只需要每个序列中的最后一个表达式节点(即规则所在的点)转发停止),或者它成为具有多个子节点的实际树节点的点(即在源中遇到实际表达式)...

我希望有一种简单的方法来消除虚拟中间表达式节点——这种类型的结构在任何具有运算符优先级的语法中必须是常见的。

语法的基本结构是从该语言的 Khronos 规范中提取的相当直接的克隆:

https://www.khronos.org/registry/gles/specs/3.1/es_spec_3.1.pdf

最佳答案

ANTLR v4 能够从处理不同优先级的单个递归规则生成代码,如果您使用这样的语法(基础数学示例):

expr : '(' expr ')'
     | '-' expr
     | expr ('*'|'/') expr
     | expr ('+'|'-') expr
     | INT
     ;

ANTLR v3 无法做到这一点,基本上要求您为每个优先级编写一个规则。因此,我建议您重写语法以避免这些样板规则。

然后,我认为您混淆了 parse tree (aka concrete syntax tree)AST (abstract syntax tree) . AST 就像解析树的简化版本,它只保留您的目的所需的内容。例如,使用上面的 expr 规则,AST 不会包含任何括号节点,因为优先级是在树本身中编码的,您通常不需要知道给定的表达式是否有括号。

您的程序应该从解析树构建一个 AST,然后从那里开始。不要直接处理解析树,即使乍一看它看起来很方便,因为该工具会为您生成它们.它很快就会变得很麻烦。构建您自己的树结构 (AST),为手头的任务量身定制。

关于ANTLR4 解析树简化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28843831/

相关文章:

python - 在antlr4 python目标中重用词法分析器对象

java - 运行时 Antlr 4.5 解析器错误

antlr - 在 ParserVisitor 中获取行号?

antlr - 这个antlr语法有什么问题吗?通配符问题?

python - ANTLR4 和 Python 目标

antlr4 - 类型生成需要65535字节以上的字符串在常量池中以utf8格式编码

antlr4 - 为新的输入字符串重用 Antlr 对象(C++ 运行时)?

compiler-construction - 将 antlr4 与 LLVM 集成

antlr - 解析器规则中不能使用范围元素?

antlr - 我可以使用 antlr 来解析部分数据吗?