一、AST版“Hello World”
public class HelloWorld {
public static void main(String[] args) {
AST ast = AST.newAST(AST.JLS3);
CompilationUnit compilationUnit = ast.newCompilationUnit();
// 创建类
TypeDeclaration programClass = ast.newTypeDeclaration();
programClass.setName(ast.newSimpleName("HelloWorld"));
programClass.modifiers().add(
ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
compilationUnit.types().add(programClass);
// 创建包
PackageDeclaration packageDeclaration = ast.newPackageDeclaration();
packageDeclaration.setName(ast.newName("com.dream"));
compilationUnit.setPackage(packageDeclaration);
MethodDeclaration main = ast.newMethodDeclaration();
main.setName(ast.newSimpleName("main"));
main.modifiers().add(
ast.newModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD));
main.modifiers().add(ast.newModifier(ModifierKeyword.STATIC_KEYWORD));
main.setReturnType2(ast.newPrimitiveType(PrimitiveType.VOID));
programClass.bodyDeclarations().add(main);
Block mainBlock = ast.newBlock();
main.setBody(mainBlock);
// 给main方法定义String[]参数
SingleVariableDeclaration mainParameter = ast
.newSingleVariableDeclaration();
mainParameter.setName(ast.newSimpleName("arg"));
mainParameter.setType(ast.newArrayType(ast.newSimpleType(ast
.newName("String"))));
main.parameters().add(mainParameter);
MethodInvocation println=ast.newMethodInvocation();
println.setName(ast.newSimpleName("prinln"));
//生成String类型的常量
StringLiteral s=ast.newStringLiteral();
s.setLiteralValue("Hello World");
println.arguments().add(s);
println.setExpression(ast.newName("System.out"));
mainBlock.statements().add(ast.newExpressionStatement(println));
System.out.println(compilationUnit.toString());
}
}
上面的代码只是生成了一个只有一个main方法的类,并且main方法里面只有一行System.out.println("Hello World");
需要注意的几点:
-
AST ast = AST.newAST(AST.JLS3);AST.JLS3为版本,如果生成的代码中用到try的话,要用AST.JLS4这个版本
-
println.setExpression(ast.newName("System.out"));如果只是调用某个变量的方法,参数可以用ast.newSimpleName和ast.newName,如果中间的表达式很复杂,会出现一些java变量定义不允许的字符,就必须用ast.newName。Name和SimpleName都是从Expression中继承而来,所以只要用到Expression的地方,都可以直接用ast.newName。
-
所有的import都要自己手动加入,本例中没有。
二、用AST解析java源代码。
ASTParser parsert = ASTParser.newParser(AST.JLS4);
String contents = "public class T{public void t(){Object o;o=System.out;}}";
parsert.setSource(contents.toCharArray());
// 使用解析器进行解析并返回AST上下文结果(CompilationUnit为根节点)
CompilationUnit result = (CompilationUnit) parsert.createAST(null);
TypeDeclaration type = (TypeDeclaration) result.types().get(0);
MethodDeclaration method = type.getMethods()[0];
ExpressionStatement ifs = (ExpressionStatement) method.getBody().statements().get(1);
Assignment expression=(Assignment)ifs.getExpression();
Expression exp=expression.getRightHandSide();
在ast中,所有的节点开成一个树,根节点为ast对象,根节点不同的两个节点不能互相添加。所以如果你想把解析出来的节点加到你自己生成的节点上,那你只有去改源代码了。在CompilationUnitResolver类的convert中的276行AST ast = AST.newAST(apiLevel);它每次都会新建一个AST,修改的办法就是重载一下这个方法,加一个AST参数。
分享到:
相关推荐
基于Eclipse-JDT生成Java源代码的AST并可视化
UML解析器此项目是一个UML解析器,它将Java源代码转换为UML图。 该项目中使用的工具和库是: Java解析器 它包括用于从Java源代码解析类,变量,方法和构造函数的类和接口。 用于该项目的Java解析器是:该程序包包含...
- 使用Java的正则表达式或有限自动机理论实现词法分析器,能够将源代码转换为词法单元序列。 - 处理词法错误,如非法字符或格式错误的数字。 2. **语法分析器**: - 定义语法规则,构建上下文无关文法(CFG)。 ...
它具有将两个不同Java源代码版本之间的检测到的源代码更改映射到从研究论文和现有突变测试中检索到的63个不同变异操作符的功能。工具。 我的论文的目的是提出一个问题,即是否可以使用突变测试来生成现实生活中的...
javaparser-1.0.8.jar库用于解析输入的Java文件并获取AST。 javaparser.jar使用遵循Visitor模式的库和函数。 项目代码中遵循相同的模式来解析输入的Java文件并创建中间代码。 例如:对于获取方法,创建了...
4.2.9 将程序与源代码相关联..... 123 4.2.10 热代码替换..... 123 4.3 远程调试...... 124 4.4 练习概述...... 125 4.5 本章小结...... 126 4.6 参考文献...... 127 第5章 协同使用Eclipse 129 5.1 Eclipse对CVS的...
4.2.9 将程序与源代码相关联..... 123 4.2.10 热代码替换..... 123 4.3 远程调试...... 124 4.4 练习概述...... 125 4.5 本章小结...... 126 4.6 参考文献...... 127 第5章 协同使用Eclipse 129 5.1 ...
4.2.9 将程序与源代码相关联..... 123 4.2.10 热代码替换..... 123 4.3 远程调试...... 124 4.4 练习概述...... 125 4.5 本章小结...... 126 4.6 参考文献...... 127 第5章 协同使用Eclipse 129 5.1 ...
**目标**:创建一个能够对源代码进行词法分析、LL(1)语法分析和LR(1)语法分析的Java程序。 **主要任务**: 1. **词法分析**: - 实现一个词法分析器,用于读取源代码并生成词法单元(tokens)。 - 定义词法规则,...
- 使用Java的正则表达式或有限自动机理论实现词法分析器,能够将源代码转换为词法单元序列。 - 处理词法错误,如非法字符或格式错误的数字。 2. **语法分析器**: - 定义语法规则,构建上下文无关文法(CFG)。 ...
- 生成代码应该能够读取源代码,并输出词法单元。 **技术要求**: - 熟悉正则表达式、有限自动机理论和算法。 - 掌握编译原理中的词法分析概念。 - 熟悉至少一种编程语言(如Java、C++、Python等)。 **开发工具**...
简单的语法、词法、语义分析器项目是一个编程项目,旨在构建一个能够对源代码进行词法分析、语法分析和语义分析的程序。这个项目可以帮助开发者深入理解编译器的工作原理,以及编程语言的理论基础。 ### 项目介绍: ...
它的任务是读取源代码,识别出一系列的词法单元(tokens)。这些词法单元是编程语言的基本语法构建块,包括关键字、标识符、常数、运算符和分隔符等。 ### 语法分析器: 语法分析器在词法分析器之后工作,它的任务是...