Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析不完整的Java源代码_Java_Parsing - Fatal编程技术网

解析不完整的Java源代码

解析不完整的Java源代码,java,parsing,Java,Parsing,在某些问题中,我需要解析可能不完整的Java源代码片段。例如,代码可以引用这些片段中未定义的变量 在这种情况下,我仍然希望解析这种不完整的Java代码,将其转换为方便的可检查表示,并能够从这种抽象表示生成源代码 什么是正确的工具?在中,我找到了使用Antlr、JavaCC或EclipseJDT的建议。 但是,我没有找到任何关于处理不完整Java源代码片段的参考资料,因此我提出了这个问题(此外,链接的问题已经存在两年多了,所以我想知道地图上是否有新的内容) 例如,代码可能类似于以下表达式: "my

在某些问题中,我需要解析可能不完整的Java源代码片段。例如,代码可以引用这些片段中未定义的变量

在这种情况下,我仍然希望解析这种不完整的Java代码,将其转换为方便的可检查表示,并能够从这种抽象表示生成源代码

什么是正确的工具?在中,我找到了使用Antlr、JavaCC或EclipseJDT的建议。 但是,我没有找到任何关于处理不完整Java源代码片段的参考资料,因此我提出了这个问题(此外,链接的问题已经存在两年多了,所以我想知道地图上是否有新的内容)

例如,代码可能类似于以下表达式:

"myMethod(aVarName)"

在这种情况下,我希望能够以某种方式检测到代码中引用了变量
aVarName

Uhm。。。这个问题没有任何模糊的答案。如果您编写正确的语法并操纵解析器来执行回退解析未知令牌传递之类的事情,上述任何解析器技术都将允许您执行您希望执行的操作

要达到目的,最简单的工作就是使用ANTLR,它具有可恢复的解析功能,并附带一个相当完整的Java7语法,或者看看可以从EclipseJDT中得到什么(它用于在EclipseIDE中进行错误和意图标记以及语法高亮显示)

请注意,这些东西都不容易——您正在编写klocs,而不仅仅是导入一个类并告诉它去做


在不正确/不完整的某一点上,所有这些策略都将失败,因为没有计算机(甚至是相关人员)能够识别您的意思,除非您至少含糊其辞地正确地说出来。

Eclipse只包含以下内容:能够处理不完整java代码的编译器(基本上,这是这些人实现自己的java编译器的一个原因。)


有几个教程解释了ASTParser,就是其中之一。

如果你只想进行基本的解析(一个未修饰的AST),你可以使用现有的Java解析器。但是从你的问题中我了解到你对深入检查部分代码感兴趣。首先,要知道你试图解决的问题远不是简单的,特别是因为部分代码引入了很多歧义

但是有一个现有的解决方案——我需要解决一个类似的问题,并且发现一个叫的好家伙已经在这个问题上做了工作,产生了一个和一对的——一个基于Eclipse,另一个(通常更好)基于Eclipse。我使用了这两个,它们都有效,尽管它们有自己的局限性——不要期待奇迹


.

在我最近的工作中,我需要解决一个类似的问题。我尝试了很多工具,包括python和。我想分享我的经验。总之,它们都可以在一定程度上解析代码片段,但当代码片段太模糊时,它们偶尔都无法解析

  • EclipseJDT语法分析器
EclipseJDTASTParser是功能最强大、使用最广泛的工具。这是一段用于解析方法调用节点的代码片段

ASTParser parser = ASTParser.newParser(AST.JLS8);
parser.setResolveBindings(true);
parser.setKind(ASTParser.K_STATEMENTS);
parser.setBindingsRecovery(true);
Map options = JavaCore.getOptions();
parser.setCompilerOptions(options);
parser.setUnitName("test");

String src = "System.out.println(\"test\");";
String[] sources = { };
String[] classpath = {"C:/Users/chenzhi/AppData/Local/Programs/Java/jdk1.8.0_131"};

parser.setEnvironment(classpath, sources, new String[] { }, true);
parser.setSource(src.toCharArray());
final Block block = (Block) parser.createAST(null);
block.accept(new ASTVisitor() {
    public boolean visit(MethodInvocation node) {
        System.out.println(node);
        return false;
    }
});
src = 'System.out.println("test");'
tokens = javalang.tokenizer.tokenize(code2)
parser = javalang.parser.Parser(tokens)
try:
    ast = parser.parse_expression()
    if type(ast) is javalang.tree.MethodInvocation:
        print(ast)
except javalang.parser.JavaSyntaxError as err:
    print("wrong syntax", err)
您应该注意
parser.setKind(ASTParser.K_语句)
,这是设置要从源代码解析的构造的类型。ASTParser定义了四种类型(K_编译单元、K_类、体声明、K_表达式、K_语句),您可以看到这一点来理解它们之间的区别

  • 爪哇郎
javalang是一个简单的python库。这是一个解析方法调用节点的代码片段

ASTParser parser = ASTParser.newParser(AST.JLS8);
parser.setResolveBindings(true);
parser.setKind(ASTParser.K_STATEMENTS);
parser.setBindingsRecovery(true);
Map options = JavaCore.getOptions();
parser.setCompilerOptions(options);
parser.setUnitName("test");

String src = "System.out.println(\"test\");";
String[] sources = { };
String[] classpath = {"C:/Users/chenzhi/AppData/Local/Programs/Java/jdk1.8.0_131"};

parser.setEnvironment(classpath, sources, new String[] { }, true);
parser.setSource(src.toCharArray());
final Block block = (Block) parser.createAST(null);
block.accept(new ASTVisitor() {
    public boolean visit(MethodInvocation node) {
        System.out.println(node);
        return false;
    }
});
src = 'System.out.println("test");'
tokens = javalang.tokenizer.tokenize(code2)
parser = javalang.parser.Parser(tokens)
try:
    ast = parser.parse_expression()
    if type(ast) is javalang.tree.MethodInvocation:
        print(ast)
except javalang.parser.JavaSyntaxError as err:
    print("wrong syntax", err)
请注意
ast=parser.parse_expression()
,就像Eclipse JDT ASTParser中的parser.setKind()函数一样,您应该设置正确的解析函数,否则将出现“javalang.parser.JavaSyntaxError”异常。您可以阅读以确定应该使用哪个函数

  • PPA
Java部分程序分析(PPA)是一个静态分析框架,它将不完整Java程序的源代码转换为类型化抽象语法树

PPA作为一组Eclipse插件提供,这意味着它需要与Eclipse一起运行。它提供了一种不显示Eclipse GUI或不需要任何用户输入的运行方式,但它太重了

String src = "System.out.println(\"test\");";
ASTNode node = PPAUtil.getSnippet(src, new PPAOptions(), false);

// Walk through the compilation unit.
node.accept(new ASTVisitor() {
    public boolean visit(MethodInvocation node) {
        System.out.println(node);
        return false;
    }
});

我不确定,但我认为这在Java中是不可能的。我肯定是错的,我认为这是一个自动过程还是手动过程?在最后一个例子中,我建议使用Eclipse及其快速修复来完成源代码。它应该是自动的为什么解析带有未定义变量名称的Java很难?您只需要一个Java语法和解析引擎;即使是现成的也有很多。您想做什么,因为“未定义的名称”是一个问题?如果代码在语法上不正确,那是另一个问题。我明白了。您认为我应该能够将Eclipse JDT作为一个独立的库来使用吗?(我的意思是,不必为此启动一个完整的Eclipse实例?)简而言之,答案是肯定的,但这并不是一个简单的过程,因为你必须弄清楚需要提取哪一组JAR文件,并弄清楚如何使用它们。如果你与eclipse工具链结合,那么使用Xtend可能会更好。Xtend和ANTLR都有更好的通用文档。还有一个工具叫做poon,这可能会让你更接近你的目标:看来JDT并不是最好的主意。你认为JavaCC可能是一种选择吗?我不明白你为什么建议Xtend,在它的网页上它看起来像一种通用语言,它是否提供了方便的工具来获取不完整的Java源代码c的表示