我正在使用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()
。然而,我不想要求用户明确指出这一点。推断我正在解析哪种类型的代码的最佳方法是什么?
EOF
标记指定为最后一个预期的标记 - 如果没有匹配任何替代方案(甚至部分匹配),那可能是原因。通过“分辨率”,我指的是用户被允许向下钻取的程度,例如,如果输入<T,V>
,您是否希望它被识别?仅仅是Foo
呢?这两个都是有效的Java片段。即使只是片段,代码生成器也有望要求语法正确的输入。 - predi