ANTLR:如何根据我们解析的规则更改生成的 AST?
ANTLR: How to change the generated AST based on the rule we parse?
ANTLR 是否可以根据我们在解析过程中的条件更改 AST?
例如,当解析像这样的字符串时:foo().dropLastBar(true).bar(),如果我们知道存在 dropLastBar(true),我们希望删除最后一次出现的柱。
现在我已经在ANTLR中使用“成员”来记录是否存在具有真实值的dropLastBar。但是我不知道如何修改ANTLR的规则,使得生成的AST会根据我们拥有的字符串而有所不同。字符串可以是foo().dropLastBar(true).bar().bar().bar(),那我们是不是可以得到foo().dropLastBar(true).bar()生成的AST。 bar() 没有解析两次?
我觉得你在这里把事情复杂化了。解析器是一种语法工具。基于 ANTLR4 的解析器根据指定的语法生成一个解析树(不是 AST 顺便说一句。),它表示它得到的输入。
您所追求的是语义处理,这不是解析器的任务,而且无论如何也不是为此而设计的。相反,在解析 运行 之后执行语义步骤,您可以在其中处理解析树以提取所需的信息。试图将这种处理强制到 grammar/parser 中是行不通的(因为它会减慢解析器的速度并使其变得更加复杂)。
ANTLR 是否可以根据我们在解析过程中的条件更改 AST?
例如,当解析像这样的字符串时:foo().dropLastBar(true).bar(),如果我们知道存在 dropLastBar(true),我们希望删除最后一次出现的柱。
现在我已经在ANTLR中使用“成员”来记录是否存在具有真实值的dropLastBar。但是我不知道如何修改ANTLR的规则,使得生成的AST会根据我们拥有的字符串而有所不同。字符串可以是foo().dropLastBar(true).bar().bar().bar(),那我们是不是可以得到foo().dropLastBar(true).bar()生成的AST。 bar() 没有解析两次?
我觉得你在这里把事情复杂化了。解析器是一种语法工具。基于 ANTLR4 的解析器根据指定的语法生成一个解析树(不是 AST 顺便说一句。),它表示它得到的输入。
您所追求的是语义处理,这不是解析器的任务,而且无论如何也不是为此而设计的。相反,在解析 运行 之后执行语义步骤,您可以在其中处理解析树以提取所需的信息。试图将这种处理强制到 grammar/parser 中是行不通的(因为它会减慢解析器的速度并使其变得更加复杂)。