gpt4 book ai didi

java - ANTLR - 如何确定什么样的解析树 "best fits"一些代码

转载 作者:搜寻专家 更新时间:2023-11-01 03:16:38 25 4
gpt4 key购买 nike

我正在使用 ANTLR 构建一个程序,我要求用户输入一些 Java 代码,它会吐出等效的 C# 代码。在我的程序中,我要求用户输入一些 Java 代码,然后对其进行解析。到目前为止,我一直假设他们会输入一些可以自行解析为有效编译单元的内容,例如像

package foo;

class A { ... }
class B { ... }
class C { ... }

然而,情况并非总是如此。他们可能只是从类内部输入代码:

public void method1() {
...
}

public void method2() {
...
}

或者方法内部:

System.out.print("hello ");
System.out.println("world!");

甚至只是一个表达式:

context.getSystemService(Context.ACTIVITY_SERVICE)

如果我尝试通过调用 parser.compilationUnit() 来解析此类片段,它将无法正常工作,因为大部分代码都被解析为错误节点。我需要根据代码的性质调用正确的方法,例如 parser.expression()parser.blockStatements()。但是,我不想要求用户明确指出这一点。推断我正在解析的代码类型的最佳方法是什么?

最佳答案

与其尝试猜测有效的语法规则入口点来解析未知范围的语言片段,不如逐步将范围包装器添加到源文本,直到实现有效的顶级规则解析。

也就是说,随着每次连续的解析失败,逐步添加虚拟包、类和方法语句作为源文本包装器。

无论添加哪个包装器以实现成功解析,都将是一个已知数量。因此,可以很容易地识别代表原始源文本的解析树节点。

可能想使用快速失败的解析器;使用 BailErrorStrategy 构建解析器以获得此行为。

关于java - ANTLR - 如何确定什么样的解析树 "best fits"一些代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47987888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com