java - ANTLR:如何根据我们解析的规则更改生成的 AST?

标签 java parsing antlr antlr4

ANTLR 是否可以根据解析过程中的条件来更改 AST?

例如,当解析像 foo().dropLastBar(true).bar() 这样的字符串时,如果我们知道存在 dropLastBar(true),我们希望删除最后一次出现的 bar。

现在我已经使用ANTLR中的“members”来记录是否存在值为true的dropLastBar。但我不知道如何修改ANTLR的规则,使得生成的AST会根据我们拥有的字符串而不同。字符串可以是foo().dropLastBar(true).bar().bar().bar(),那么我们是否可以得到foo().dropLastBar(true).bar()生成的AST。 bar() 不解析两次?

最佳答案

我认为你在这里不必要地使事情复杂化了。解析器是一个语法工具。基于 ANTLR4 的解析器生成一个解析树(顺便说一句,不是 AST),它表示根据指定语法获得的输入。

您所追求的是语义处理,这不是解析器的任务,而且它也不是为此而设计的。相反,在解析运行后执行语义步骤,在其中处理解析树以提取所需的信息。尝试将此类处理强制到语法/解析器中不会很好地工作(因为它会减慢解析器的速度并使其变得更加复杂)。

关于java - ANTLR:如何根据我们解析的规则更改生成的 AST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62845570/

相关文章:

java - ProgressBar.setProgress 接受整数有解决方法吗?

java - 在 HashMap Key 中输入 3 个属性

c - yacc/bison 操作的范围是什么?

clojure - 如何使用 Clojure 分析 Java 源文件

c# - 为什么 input.TokenStream 解析为 null?

java - 在 FMJ 中找不到捕获设备

具有多种实现的 Java 依赖注入(inject)

java - 使用 Java String split() 很简单 "parser"

sql - 从字符串中提取日期并将其插入Microsoft SQL Server 2012字段

antlr - ^ 和 !在 ANTLR 语法中代表