抽象语法树手动生成--java实现
本人博客内编译原理文章的配套资源jar包,包括词法分析,语法分析,中间代码生成,静态语义检查,代码解释执行以及抽象语法树的手动生成:https://download.csdn.net/download/as1072966956/10448935
转载请注明出处。
ManualAST.java
package sch.cauc.edu.token;import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.Assignment;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.ExpressionStatement;
import org.eclipse.jdt.core.dom.IfStatement;
import org.eclipse.jdt.core.dom.InfixExpression;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.WhileStatement;import edu.ustc.cs.compile.util.ir.HIRPack;//import org.eclipse.jdt.core.dom.*;
//import edu.ustc.cs.compile.util.ir.HIRPack;
/*** ManualAST* 创建人:xrzhang * 时间:2018年5月19日-下午3:54:50 * @version 1.0.0**/
public class ManualAST{public static void main(String [] args) {HIRPack ir = new HIRPack();ManualAST testcase=new ManualAST();ir.setIR(testcase.createSampleAST());ir.showIR();}/*** ** 产生一个如下程序的AST。<br>* <pre><code>*{* m=12;* n=21;* if(m<n)* {t=m;m=n;n=t;* }* r=m%n;* while(r!=0)* {m=n;n=r;r=m%n;}* print(n);*}* </code></pre>* 方法名:createSampleAST* 创建人:xrzhang * 时间:2018年5月19日-下午3:54:23 * 邮件:jmzhang_15_cauc@163.com* @return Block* @exception * @since 1.0.0*/private Block createSampleAST() { AST ast = AST.newAST(AST.JLS3);Assignment assign;ExpressionStatement ex;InfixExpression infixEx;//main 方法体Block mainBody = ast.newBlock();//赋值表达式m=12assign = ast.newAssignment();assign.setLeftHandSide(ast.newSimpleName("m"));assign.setOperator(Assignment.Operator.ASSIGN);assign.setRightHandSide(ast.newNumberLiteral("12"));ex=ast.newExpressionStatement(assign);mainBody.statements().add(ex);//赋值表达式n=15assign = ast.newAssignment();assign.setLeftHandSide(ast.newSimpleName("n"));assign.setOperator(Assignment.Operator.ASSIGN);assign.setRightHandSide(ast.newNumberLiteral("15"));ex=ast.newExpressionStatement(assign);mainBody.statements().add(ex);//关系表达式m<ninfixEx = ast.newInfixExpression();infixEx.setLeftOperand(ast.newSimpleName("m"));infixEx.setRightOperand(ast.newSimpleName("n"));infixEx.setOperator(InfixExpression.Operator.LESS);Block ifbody =ast.newBlock();//赋值表达式t=massign = ast.newAssignment();assign.setLeftHandSide(ast.newSimpleName("t"));assign.setOperator(Assignment.Operator.ASSIGN);assign.setRightHandSide(ast.newSimpleName("m"));ex=ast.newExpressionStatement(assign);mainBody.statements().add(ex);//赋值表达式m=nassign = ast.newAssignment();assign.setLeftHandSide(ast.newSimpleName("m"));assign.setOperator(Assignment.Operator.ASSIGN);assign.setRightHandSide(ast.newSimpleName("n"));ex=ast.newExpressionStatement(assign);mainBody.statements().add(ex);//赋值表达式n=tassign = ast.newAssignment();assign.setLeftHandSide(ast.newSimpleName("n"));assign.setOperator(Assignment.Operator.ASSIGN);assign.setRightHandSide(ast.newSimpleName("t"));ex=ast.newExpressionStatement(assign);mainBody.statements().add(ex);IfStatement ifst =ast.newIfStatement();ifst.setExpression(infixEx);ifst.setThenStatement(ifbody);mainBody.statements().add(ifst);//赋值语句r=m%ninfixEx = ast.newInfixExpression();infixEx.setLeftOperand(ast.newSimpleName("m"));infixEx.setRightOperand(ast.newSimpleName("n"));infixEx.setOperator(InfixExpression.Operator.REMAINDER);assign = ast.newAssignment();assign.setLeftHandSide(ast.newSimpleName("r"));assign.setOperator(Assignment.Operator.ASSIGN);assign.setRightHandSide(infixEx);ex=ast.newExpressionStatement(assign);mainBody.statements().add(ex);//while语句的AST节点WhileStatement whilest = ast.newWhileStatement();infixEx = ast.newInfixExpression();infixEx.setLeftOperand(ast.newSimpleName("r"));infixEx.setRightOperand(ast.newNumberLiteral("0"));infixEx.setOperator(InfixExpression.Operator.NOT_EQUALS);whilest.setExpression(infixEx);Block whilebody = ast.newBlock();//m=nassign = ast.newAssignment();assign.setLeftHandSide(ast.newSimpleName("m"));assign.setOperator(Assignment.Operator.ASSIGN);assign.setRightHandSide(ast.newSimpleName("n"));ex=ast.newExpressionStatement(assign);whilebody.statements().add(ex);//n=rassign = ast.newAssignment();assign.setLeftHandSide(ast.newSimpleName("n"));assign.setOperator(Assignment.Operator.ASSIGN);assign.setRightHandSide(ast.newSimpleName("r"));ex=ast.newExpressionStatement(assign);whilebody.statements().add(ex);//r=m%ninfixEx = ast.newInfixExpression();infixEx.setLeftOperand(ast.newSimpleName("m"));infixEx.setRightOperand(ast.newSimpleName("n"));infixEx.setOperator(InfixExpression.Operator.REMAINDER );assign = ast.newAssignment();assign.setLeftHandSide(ast.newSimpleName("r"));assign.setOperator(Assignment.Operator.ASSIGN);assign.setRightHandSide(infixEx);ex=ast.newExpressionStatement(assign);whilebody.statements().add(ex);whilest.setBody(whilebody);mainBody.statements().add(whilest);//print语句的AST节点MethodInvocation p1 =ast.newMethodInvocation();p1.setName(ast.newSimpleName("print"));p1.arguments().add(ast.newSimpleName("n"));ex=ast.newExpressionStatement(p1);mainBody.statements().add(ex);return mainBody;}
}
抽象语法树手动生成--java实现相关推荐
- Java解析SQL生成语法树_04. Hive源码 — HQL解析(抽象语法树的生成和语义分析)
HQL的解析过程主要在Driver中的compile方法,这一些主要看这个方法中的代码. 1. compile中的主要内容 public int compile(String command, boo ...
- AST抽象语法树的基本思想
AST抽象语法树的基本思想 前言 AST概述 AST结构 AST解析 转换 生成 前言 在阅读java ORM框架spring data jpa的源码时,发现Hibernate(spring data ...
- php ast 抽象语法树,AST抽象语法树的基本思想
AST抽象语法树的基本思想 前言 AST概述 AST结构 AST解析 转换 生成 前言 在阅读java ORM框架spring data jpa的源码时,发现Hibernate(spring data ...
- java抽象语法树_抽象语法树AST的全面解析(一)
Javac编译概述 将.java源文件编译成.class文件,这一步大致可以分为3个过程: 1.把所有的源文件解析成语法树,输入到编译器的符号表: 2.注解处理器的注解处理过程: 3.分析语法树并生成 ...
- hive遍历_Hive解析流程-抽象语法树生成
HiveQL解析流程: Hive根据Antlr定义的词法.语法规则完成词法.语法分析将HQL解析为AST Tree: 遍历AST Tree,抽象出查询的基本组成单元Query Block: 遍历Que ...
- hive查询where join_Hive解析流程-抽象语法树生成
HiveQL解析流程: Hive根据Antlr定义的词法.语法规则完成词法.语法分析将HQL解析为AST Tree: 遍历AST Tree,抽象出查询的基本组成单元Query Block: 遍历Que ...
- 【转载】抽象语法树简介(有图)
转载自http://blog.chinaunix.net/uid-26750235-id-3139100.html 抽象语法树简介 (一)简介 抽象语法树(abstract syntax code,A ...
- 【转】抽象语法树简介(AST)
引用地址:http://blog.chinaunix.net/uid-26750235-id-3139100.html 抽象语法树简介 (一)简介 抽象语法树(abstract syntax code ...
- Redy语法分析--抽象语法树简介
抽象语法树简介 (一)简介 抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,这所以说是抽象的,是因为抽象语 ...
最新文章
- 实践指南 | 用PyTea检测 PyTorch 中的张量形状错误
- matlab与excel的交互
- 框架、文档、视图类之间的调用关系
- wxWidgets:测试样品
- PL/SQL中的=作用
- 《大型网站技术架构:核心原理与案例分析》-- 读书笔记 (2) : 大型网站核心架构要素(5) -- 安全性...
- chrome最强大的浏览器插件推荐,只要你会用其他的插件你可以删除了
- 【Ubuntu】ubuntu 16.04 设置root用户初始密码
- 医学方面的创业计划书_医学生创业计划书
- RedHat7安装QQ
- 大华设备播放过程中设置播放速度
- 国内好的破解软件下载站
- 【自学与引导】 大数据技术 技能课程总结篇
- EXCEL中删除灰色边框的方法
- eclipse简单导入xtend项目
- 制作独特彩妆美女模特头像照片的PS教程
- 基站、WiFi、IP定位原理介绍与区别
- asp.net中使用JMail发邮件
- swfupload图片上传
- 读《一个真实的林徽因》有感