本人博客内编译原理文章的配套资源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实现相关推荐

  1. Java解析SQL生成语法树_04. Hive源码 — HQL解析(抽象语法树的生成和语义分析)

    HQL的解析过程主要在Driver中的compile方法,这一些主要看这个方法中的代码. 1. compile中的主要内容 public int compile(String command, boo ...

  2. AST抽象语法树的基本思想

    AST抽象语法树的基本思想 前言 AST概述 AST结构 AST解析 转换 生成 前言 在阅读java ORM框架spring data jpa的源码时,发现Hibernate(spring data ...

  3. php ast 抽象语法树,AST抽象语法树的基本思想

    AST抽象语法树的基本思想 前言 AST概述 AST结构 AST解析 转换 生成 前言 在阅读java ORM框架spring data jpa的源码时,发现Hibernate(spring data ...

  4. java抽象语法树_抽象语法树AST的全面解析(一)

    Javac编译概述 将.java源文件编译成.class文件,这一步大致可以分为3个过程: 1.把所有的源文件解析成语法树,输入到编译器的符号表: 2.注解处理器的注解处理过程: 3.分析语法树并生成 ...

  5. hive遍历_Hive解析流程-抽象语法树生成

    HiveQL解析流程: Hive根据Antlr定义的词法.语法规则完成词法.语法分析将HQL解析为AST Tree: 遍历AST Tree,抽象出查询的基本组成单元Query Block: 遍历Que ...

  6. hive查询where join_Hive解析流程-抽象语法树生成

    HiveQL解析流程: Hive根据Antlr定义的词法.语法规则完成词法.语法分析将HQL解析为AST Tree: 遍历AST Tree,抽象出查询的基本组成单元Query Block: 遍历Que ...

  7. 【转载】抽象语法树简介(有图)

    转载自http://blog.chinaunix.net/uid-26750235-id-3139100.html 抽象语法树简介 (一)简介 抽象语法树(abstract syntax code,A ...

  8. 【转】抽象语法树简介(AST)

    引用地址:http://blog.chinaunix.net/uid-26750235-id-3139100.html 抽象语法树简介 (一)简介 抽象语法树(abstract syntax code ...

  9. Redy语法分析--抽象语法树简介

     抽象语法树简介 (一)简介 抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,这所以说是抽象的,是因为抽象语 ...

最新文章

  1. 实践指南 | 用PyTea检测 PyTorch 中的张量形状错误
  2. matlab与excel的交互
  3. 框架、文档、视图类之间的调用关系
  4. wxWidgets:测试样品
  5. PL/SQL中的=作用
  6. 《大型网站技术架构:核心原理与案例分析》-- 读书笔记 (2) : 大型网站核心架构要素(5) -- 安全性...
  7. chrome最强大的浏览器插件推荐,只要你会用其他的插件你可以删除了
  8. 【Ubuntu】ubuntu 16.04 设置root用户初始密码
  9. 医学方面的创业计划书_医学生创业计划书
  10. RedHat7安装QQ
  11. 大华设备播放过程中设置播放速度
  12. 国内好的破解软件下载站
  13. 【自学与引导】 大数据技术 技能课程总结篇
  14. EXCEL中删除灰色边框的方法
  15. eclipse简单导入xtend项目
  16. 制作独特彩妆美女模特头像照片的PS教程
  17. 基站、WiFi、IP定位原理介绍与区别
  18. asp.net中使用JMail发邮件
  19. swfupload图片上传
  20. 读《一个真实的林徽因》有感

热门文章

  1. 从子类化到Typeclass
  2. 查看文件夹大小容量size工具treesizeportable
  3. 二氧化钛接枝聚(苯乙烯-二乙烯苯)/马来酸酐多孔纳米复合微球
  4. wifi产品演进趋势
  5. 最怕一生碌碌无为,还说平凡难能可贵。
  6. juicer模板引擎学习
  7. 总线锁,缓存锁,emsi
  8. 华为OD机试 - 统一限载货物数最小值(Java JS Python)
  9. Jason格式化Google插件FeHelper(Get请求)
  10. ubuntu下Python虚拟环境的安装、激活、退出