当前位置: 首页 > 知识库问答 >
问题:

用AST查找Java程序中的所有布尔表达式

国言
2023-03-14

我正在JavaSymbolic PathFinder之上为Java程序构建一个符号评估测试生成器工具。作为这项工作的一部分,我需要识别Java源文件中的所有布尔表达式,并记录有关它们的信息。我希望能够使用AST框架,如Eclipse JDT或Sun的com.sun.source.tree类,在那里我可以访问表达式并让AST告诉我表达式的类型。

EclipseJDT似乎支持这一点,但前提是您从Eclipse内部运行。关于在Eclipse之外运行JDT的文章很有帮助:JDT中没有Eclipse环境的IJavaProject,以及在Eclipse IDE环境之外执行Eclipse插件(JDT/ast)。然而,这些并不是我想要的;不带Eclipse的JDT?可能非常接近,但我不想从命令行使用JDT,我想将它的一部分合并到我的Java库中,该库将在Java符号探索者中运行。

如果我在Ant构建脚本中包含以下Eclipse库:

<pathelement path="${eclipse-plugin-loc}\org.eclipse.core.contenttype_3.4.200.v20120523-2004.jar"/>
<pathelement path="${eclipse-plugin-loc}\org.eclipse.core.jobs_3.5.200.v20120521-2346.jar"/>
<pathelement path="${eclipse-plugin-loc}\org.eclipse.core.resources_3.8.0.v20120522-2034.jar"/>
<pathelement path="${eclipse-plugin-loc}\org.eclipse.core.runtime_3.8.0.v20120521-2346.jar"/>
<pathelement path="${eclipse-plugin-loc}\org.eclipse.equinox.common_3.6.100.v20120522-1841.jar"/>
<pathelement path="${eclipse-plugin-loc}\org.eclipse.equinox.preferences_3.5.0.v20120522-1841.jar"/>
<pathelement path="${eclipse-plugin-loc}\org.eclipse.jdt.compiler.apt_1.0.500.v20120522-1651.jar"/>
<pathelement path="${eclipse-plugin-loc}\org.eclipse.jdt.compiler.tool_1.0.101.v20120522-1651.jar"/>
<pathelement path="${eclipse-plugin-loc}\org.eclipse.jdt.core_3.8.1.v20120531-0637.jar"/>
<pathelement path="${eclipse-plugin-loc}\org.eclipse.jdt_3.8.0.v201206081400.jar"/>
<pathelement path="${eclipse-plugin-loc}\org.eclipse.text_3.5.200.v20120523-1310.jar"/>
<pathelement path="${eclipse-plugin-loc}\org.eclipse.text_3.5.200.v20120523-1310.jar"/>
<pathelement path="${eclipse-plugin-loc}\org.eclipse.osgi.util_3.2.300.v20120522-1822.jar"/>
<pathelement path="${eclipse-plugin-loc}\org.eclipse.osgi_3.8.0.v20120529-1548.jar"/>

然后我可以让JDT使用以下代码运行:

public void processJavaFile(File toVisit) {
    try {
        String source = readFileToString(toVisit);
        Document document = new Document(source);
        ASTParser parser = ASTParser.newParser(AST.JLS4);
        parser.setResolveBindings(true);
        parser.setSource(document.get().toCharArray());
        CompilationUnit unit = (CompilationUnit) parser.createAST(null);
        PreprocessClassVisitorEclipse pp = new PreprocessClassVisitorEclipse(unit);
        unit.accept(pp);

    } catch (IOException io) {
        System.out.println("Something went wrong with the files!");
    }
}

但这没有正确的上下文供解析器解析类型绑定;在查阅Eclipse文档时,我必须将解析器用于IJavaProject:http://publib.boulder.ibm.com/infocenter/rsahelp/v7r0m0/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/ASTParser.html.

那么,有什么想法可以让一个运行JDT的IJavaProject作为另一个可执行文件中的库吗?或者,还有其他Java具有类型信息的AST吗?提前感谢您的帮助。

共有1个答案

萧允晨
2023-03-14

尝试添加以下内容:

parser.setEnvironment(null, null, null, true);
parser.setUnitName(toVisit.getName())

此外,您可以摆脱Document并仅使用

 parser.setSource(source.toCharArray());

参见:StandAloneASTParserTest.java和错误206391

 类似资料:
  • 问题内容: 假设我有以下表达式 Eclipse警告我,布尔表达式的第二个短语中可能为空。但是,我知道有些人会在第一个条件失败的情况下完全退出布尔表达式。Java是否正确?还是不能保证评估顺序? 问题答案: 但是,我知道有些人会在第一个条件失败的情况下完全退出布尔表达式。Java是否正确? 是的,这就是所谓的短路评估。操作员喜欢和是执行此类操作的操作员。 还是不能保证评估顺序? 不,可以保证评估的顺

  • 我正在寻找一种相对简单的(与编写解析器相比)方法来计算Java中的布尔表达式,我不想使用JEP库。 我有一个字符串表达式,如:

  • 问题内容: 我正在寻找一种相对简单的方法(与编写解析器相比)来评估Java中的布尔表达式,并且我不想使用JEP库。 我有一个String表达式,例如:我的目标是用值替换变量。 有没有一种方法可以评估此​​表达式? 请记住,这可以是任何深度,因此编写解析器将非常复杂。 问题答案: 您可以使用Java6中的脚本引擎,并选择任何流行的脚本语言,例如Scala,Ruby,Python,Groovy和Jav

  • 我开始学习布尔表达式。我正试图找出以下问题: 假设age1、age2和age3是int变量,假设答案是布尔变量。编写一个表达式,当age1小于或等于age2并且age2小于或等于age3时,该表达式将答案指定为true。否则答案应为false。 我已经尝试了一些东西,但对Java来说还是比较陌生的。我能把答案打印出来,但我的数字还是有问题。 这是错误的: 我只是不知道如何解决这个问题,或者代码中到

  • 我有两个实体:类别和具有一对多关系的产品。 如果价格大于100,我如何按产品数量订购类别?类似(这不起作用):

  • 问题内容: 所以我有一个关于考试作业的问题,在这个作业中,我们有一堆布尔表达式,例如: 然后,我们应该编写布尔表达式的值。为此,我使用了三值逻辑,但是当您获得如下所示的布尔表达式时,这将如何应用: 或者 通过三值逻辑可以很容易地找到第一个,但是我如何找出另外两个。 我知道这是一个非常基本的问题,但是我对此仍然是陌生的。 提前致谢 问题答案: 您需要布尔值和的三相真值表: 该表是缩写,依赖于布尔逻辑