Tag: abstract syntax tree

使用antlr3的简单标准表达式解析器

我想用antlr3创建一个简单的条件表达式解析器 更新:单独的AND OR表达式规则以支持AND / OR不同的层次结构,但还有另一个问题:如果表达式类似于:a = 1且b = 2且c = 3根据当前工具,树应如下: = = (a = 1)(b = 2)(c = 3) But I want to generate it as follows: = = (a = 1)(b = 2) (c = 3) First “and” should be higher priority than another, because I want to parse all the expression as […]

在Eclipse JDT Java解析器中,是否可以逐节遍历AST节点而无需使用访问者?

通过Eclipse JDT API访问节点信息的标准方法是使用Visitor的模式。 例如: unit.accept(new MyVisitorAdapter() { @Override public void visit(MethodCallExpr node, Object arg) { System.out.println(“found method call: ” + node.toString()); } }, null); 在这种情况下,要访问节点,我需要指定我感兴趣的节点类型(针对此情况的MethodCallExpr )。 但是,为了继续以通用方式访问节点信息,我应该覆盖所有的visit()方法,可能枚举Eclipse JDT API中可用的每种节点。 这里可以找到完成它的完整示例。 在这种情况下,虽然不完全在Code Coverage的同一域中,但我希望能够控制Eclipse JDT Java Parser完成的遍历。 我想遍历AST节点,可能会通过所有节点,选择我想要的,但不限制类型,如上面的代码所示。 可能吗? 是否有通过Eclipse JDT API执行此操作的标准方法?

Java静态元编程

我想实现一个基于现有“prototype”类生成新类的注释处理器。 import java.util.List @MyAnnotation class MySuperClassPrototype { static MySuperClassPrototype createInstance() { return new MySuperClassPrototype(); } } 由于下面的代码。 将生成以下新源文件(编译单元): import java.util.List class MySuperClass { static MySuperClass createInstance() { return new MySuperClass(); } public void specialAddedMethod() { /*…*/ } } 我想复制所有顶级import语句和静态成员,而不是原型类的静态成员。 我用Compiler Tree API(com.sun.source.tree)移动了很多。 我可以打印出Tree数据类型,同时用new class name替换old。 但是有些问题似乎很难。 如果我在树中获得Tree.Kind.IDENTIFIER,我如何找到它引用的实际类。 我需要用MySuperClass标识符替换所有出现的MySuperClassPrototype标识符,然后打印出整个树。 这可行吗? 类似地,我需要过滤掉@MyAnnotation注释,然后再用Tree.Kind.IDENTIFIER或Tree.Kind.MEMBER_SELECT表示。 如何找到此标识符引用的实际注释类? 另一个问题是打印树。 如果我使用toString方法,我得到了不错的结果,但是构造函数被打印为具有“”名称的方法而不是与其类同名的方法,因此我需要手动打印每种树节点。 你可以看到我在这里附带的代码

如何使用JDT / AST将代码段添加到方法体

我正在尝试使用JDT / AST生成Java源代码。 我现在有MethodDeclaration,并希望将代码片段(来自其他来源)添加到方法体。 代码段可以包含任何Java代码, 甚至是语法无效的代码 。 我只是找不到这样做的方法。 使用JCodeModel,您将使用JBlock#directStatement(String s)方法 。 有没有办法用JDT / AST做到这一点?

Eclipse JDT ASTParser错误地转换枚举声明节点

我正在使用JDT分析Java代码,并依赖于org.eclipse.jdt.core包而不是eclipse插件来构建独立的分析工具。 但我发现我的工具在Java代码中出现的枚举声明节点上无法正常工作。 在由jdt创建的AST中,关键字enum被视为typename而不是enum声明。 所以我想知道我应该怎样才能确保我的工具能够正确处理枚举声明。 我使用的jdt包是“org.eclipse.jdt.core_3.8.3.v20130121-145325.jar”。 createAST代码是: char[] javaprogram=getJavaFile(javaFileName); ASTParser parser = ASTParser.newParser(AST.JLS4); parser.setSource(javaprogram); parser.setKind(ASTParser.K_COMPILATION_UNIT); final CompilationUnit cu = (CompilationUnit) parser.createAST(null); java输入如下: package test; enum Color { RED(255, 0, 0), BLUE(0, 0, 255), BLACK(0, 0, 0), YELLOW(255, 255, 0), GREEN(0, 255, 0); private int redValue; private int greenValue; private int blueValue; private Color(int rv, int gv, […]

将Antlr语法树转换为有用的对象

我正在思考如何最好地使用Antlr生成AST并将其转换为有用的对象,我可以在我的程序中使用它。 我的语法(除了学习)的目的是创建一个可执行(运行时解释)语言。 例如,如何获取属性子树并实例化特定的Attribute类。 例如 我的语言中的以下代码: Print(message:”Hello stackoverflow”) 会产生以下AST: alt text http://img36.imageshack.us/img36/1672/simpleast.png 我目前的想法是工厂类可以读取树,提取名称( message ),并键入( STRING )值(“ Hello stackoverflow ”)。 现在,知道我可以实现正确类(例如,一个StringAttribute类)并传入所需属性数据的类型 – name和value 。 可以将相同的方法用于定义工厂,提取定义名称( Print ),实例化Print类,然后传入属性工厂生成的属性。 对于更复杂的程序,事情会变得更复杂: Program(args:[1,2,3,4,5]) { If(isTrue:IsInArray(array:{Program.args} value:5)) { Then { Print(message:”5 is in the array”) } Else { Print(message:”More complex ” + “message”) } } } alt text http://img205.imageshack.us/img205/3452/complexast.png 任何/所有的帮助或想法都非常受欢迎。 非常感谢。 […]

使用javax.lang.model或ANTLR JavaParser获取Java源代码信息的示例/教程

我想为简单的Java Logic创建一个类似流程图的自动化可视化,为此我需要解析Java源代码,我有2个候选者,Java 6的ANTLR和javax.lang.model 。两者都不容易。 我还没有找到一个可以远离我想要实现的工作示例。 我想找到简单的变量声明,赋值和流(if,for,switch,boolean conditions等) 这些中的任何一个都有简单的示例或教程吗? 我发现很少有ANTLR示例(其中没有一个是开箱即用的,没有重要的“家庭作业”),绝对没有javax.lang.model

用于比较AST的API?

有没有一个开源java api,它允许比较两个抽象语法树的java源代码? 我想看看两个语法树之间的差异,类似于在diff工具中完成的方式。

基于AST的Eclipse搜索

是否有Eclipse插件可以让您根据项目文件的Java AST(抽象语法树)进行搜索? “Java搜索”function似乎不包括以下情况: “让我在所有类中声明为’X’类型的所有字段” 我可以想象使用基于AST的搜索可以打开更多的可能性,但我甚至不知道这样的插件是否具有实际性能。 更新 :正如下面Kevin所指出的,Java搜索function确实涵盖了我提到的用例。 我仍然很好奇,不管是否有人编写了一个插件,允许任意类型的AST搜索,例如。 “获取所有字符串连接”(带有+运算符和StringLiteral操作数的InfixExpression)

使用Java从具有访问者模式的AST构建控制流图

我正在试图弄清楚如何实现我的LEParserCfgVisitor类,以便从已经用JavaCC生成的Abstract-Syntax-Tree构建控制流图。 我知道有些工具已经存在,但我正在尝试为我的编译器最终做准备。 我知道我需要有一个数据结构,将图形保存在内存中,我希望能够在每个节点中保留IN,OUT,GEN,KILL等属性,以便以后能够进行控制流分析。 我的主要问题是我还没弄清楚如何将不同的块连接在一起,因为根据它们的性质在每个块之间有正确的边缘:分支,循环等。换句话说,我还没有找到一个明确的算法,可以帮助我建立我的访客。 这是我的空访客。 你可以看到它适用于基本的语言表达式,比如if,while和基本操作(+, – ,x,^,…) public class LEParserCfgVisitor implements LEParserVisitor { public Object visit(SimpleNode node, Object data) { return data; } public Object visit(ASTProgram node, Object data) { data = node.childrenAccept(this, data); return data; } public Object visit(ASTBlock node, Object data) { } public Object visit(ASTStmt node, Object data) { } public […]