版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理课程设计实验报告姓名:赵军旺学号:0906840442 指导老师:赵洋 日期:2012/6/7编译原理课程设计实验报告一一096840442 赵军旺实验目通过对抽象语法树的结点的遍历,将各种节点类用graphviz显示岀来, 即把一棵抽象的树用可见的图形表示。加深对编译原理学习中语法树的认识。 同时了解ast类和astnode类的结构及visitor设计模式。实验内容开发平台:myeclipse内容:1>解析java源程序,生成ast2、遍历ast树,用astnode节点提供的visitor模式(accept)对各个节点 进行遍历。3、将遍历的结果生成符合graphviz语法的文
2、件,并用dot.exe生成可见 的语法树。概要设计1> jdtast类:实现对java源文件的逐行读入,存放于一个文件流中,然 后将整个文件流作为参数传给parser进行ast解析,生成一个 compilationunit,并调用其accept方法,指定一个visitor类,我这里 用的是 treevisitoro2、treevisitor 类:扩展 astvisitor 类,重载他的 visit仃 node), "t一共 有83中,也就是说我们要重载83次visit方法,astvisitor类还提供 endvisit()、previsit()、postvisit()等方法,由
3、于遍历树的时候可以不用 这些方法,所以没有重载。3、testjava类:这个文件是要被解析的类,为了验证解析是否正确,这 个类中的方法还是比较充分的,但是肯定没有全部覆盖,因为如果全 部翻盖,生成的png文件就太大了。4、eclipse ast的总体结构1) org.eclipse.jdt.core.dom.ast (ast 节点类)eclipse ast的工厂类,用于创建表示各种语法结构的节点。2) org.eclipse.jdt.core.dom.astnode 及其派生类(ast 类)用于表示java语言中的所有语法结构,在实际使用中常作为ast 上的节点出现。3) org.eclips
4、e.jdt.core.dom.astvisitor (astvisitor 类)eclipse ast的访问者类,定义了统一的访问ast中各个节点的方法。四.详细设计及源代码jdtast. java:(导入的包在此没有给出)public class jdtast private astparser parser = astparser.newparser(ast.jls3);private compilationunit cu = null; / java源文it fl勺纟占木勾compilationunitpublic void setsource (file f)/将java文件f建立编译
5、结构bufferedreader reader;try reader = new bufferedreader(new filereader (f);stringbuffer sourcestr = new stringbuffer ();string tempstr;bufferedreader br = new bufferedreader(new filereader(f); while (tempstr = br.readline()!= null) sourcestr append (”n”). append (tempstr) ; / 将 jeva文件逐行 加载进来reader.c
6、lose ();parser setkind(astparser k_compilation_unit);parser.setsource(sourcestrtostring()tochararray();/ 将 加载的文件再加载到解析器里cu = (compilationunit) parser.createast(null); catch (exception e) e.printstacktrace ();public string acceptor(treevisitor treevisitor) cu.accept(treevisitor);return treevisitor.ge
7、tstring();public static void main(string args) throws interruptedexceptionjdtast asttree = new jdtast();file file = new file ( n srcmypacktest java . java,!); asttreesetsource (file);treevisitor treevisitor = new treevisito:r();string ss = esttree.accept_visitor(treevisitor);try bufferedwriter bfbuf
8、feredwriter = new bufferedwriter(new filewriter (new file (,fc : graph. txth ); bfbufferedwriter.write(ss);bfbufferedwriter.close ();runtime rt = runtimege七ru门七ime();rtexec(new string,!c : wprogram files(x86)graphviz2.29bindot.exe",nc: wgraph. txt,f, h-tpng,f, n-o,!, ,fc: wmypng.png11 ); thread
9、 tr = new thread();tr.shep(loooo) ; /调用延时程序,以便牛成图片runtime rt2 = runtime.getruntime();rt2 exec (,f cmd /c start c : wmypng. png” ); catch (ioexception e) e.printstacktrace();treevis . java:主要实现tvisit (t node)方法的重载,这里仅列举一些比较常用的节点的visit方法astvisitorpublic class treevisitor extendsstatic string str =stat
10、ic int id = 1;/字符串,最后传给graphviz调用 /id为每个节点编号,便于图形的输出public treevisitor()str += ndigraphnn;public boolean visit (assignment node) / 两边都是变量的赋值表达式 nodesetflags(id+);str += node . getflags () + ,f label = '"assignment、"” + ,f; n,f;str += node.getperent()getflags() + n->n + node.getflags
11、() +return super.visit(node);public bo olean visit (compilati on unit no de) / 编译单元,第一个访问的 节点nodesetflags(工d+);if (node.getparent() = null) str += nllabel =ncompilationunitn ,shape = mrecord;nn; elsestr += node.getparent () .getflags () + n->n + node.getflags()return super.visit(node);public bool
12、ean visit(continuestatement node) / continuenodesetflags(工d+);str += node-getflags () + h label = 1111 4- “continue" + nn n + h; nh; str += node.getparent () .getflags () + ,f-+ node.getflags () +return super.visit(node);public boolean visit (inf ixexpression node) / 中缀表达式 a+b , a>b 等nodeset
13、flags(id+);str += node . ge tfimgs () + 11 la be丄= uu + node . getoperator () + n 11 n+n'*;str += node . ge tparen t( ).ge tfj_3gs() + u->n + node . getflags () +return super.visit(node);public boolean visit (postfixexpression node) / 后缀表达式 i + + nodesetflags(id+);str += node.getflags() + &qu
14、ot;label = "" + "postfix:”+ node . getoperator () + n 11 n + n; n n;str += node . getparent () . getflags () + n->,f + node . getflags () + n;nn;return super.visit(node);public string get string () / 返回字符串str += nnn;return str;testjavajava要被解析的java文件package mypack;import javaxannot
15、ationresource;resource/ * * author administrator */public class testjava public testjava()system, out. printin (111 love java11);public static void main(string args)testjava testjava = new testjava();clsa cisa = new clsa();boolean bool = true;int num = 4;char charac = 1 i 1 ;system.out.printin(testj
16、ava instanceof testjava);switch (num) case 1:system.out.printin("easel out”);break;default:break;for (int j = 0; j < 5; +j)if (j > 3)break;int cd = 0;while (cd < 5)cd+ + ;system.out.printin(1 > 2 ? 3 : 4);try system.out.printin("tryout"); catch (exception e) esetstacktrace
17、(null);class clsc extends clsa class clsa int a;int b;class clsb int c;int d;public int method (irrt s, int e) / i love youclsa clsa = new clsa();for (int i = 1; i < 10; i+)clsa.a += i;s += e;return s + e;五、程序调试1.遇到的问题a、刚开始没有用visitor设计模式,自己对语法树进行了自 顶向下的遍历,只简单的实现了把导入的包、类和方法的定义画 成图片,在程序里用递归解决类中再定义类的问题。画出的图像如下:但这并不是一个好的方法,费事费力,后来通过查阅网上的 api文档,发现ast类实现了访问者模式,我们只要调用visit 方法就可以轻松访问各个节点。b、生成的png不知道如何打开,刚开始尝试着建立一个panei 板块来实现图像的显示,但是发现这样不能进行图像的缩放,看 起来很不舒服,后来用dos进行图片的打开,方便了图片的查看。c、还有一个问题就是不知道如何对节点进行编号,因为我们 总要设置一个标识,访问节
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- JJF 1111-2026调制度测量仪校准规范
- T/SDMTGM 0002-2018热成形生产线用高速双臂机械手
- T/JX 029-2024“金平湖”葡萄
- T/CCSAS 060-2025涉氢建筑物及容器泄爆设计方法
- T/CCPS 0002-2023青少年艺术素养(音乐)水平评价规范
- T/CSPSTC 141-2024海域管道水平定向钻施工技术规范
- GB/T 33897-2026生物聚酯聚羟基烷酸酯(PHA)吹塑薄膜
- AI在科学史中的应用
- PHP程序设计期末考核试题(含详细答案)
- 2026年福建省综合性评标专家库评标专家考试练习题及答案
- 2026中国眼科创新药物研发趋势及商业价值评估研究
- JJF 2463-2026烟气含湿量测量仪校准规范
- 高中高一年级信息技术“变量与程序设计综合应用-设计购买纪念品的最佳方案”教学设计
- 2026年上半年软考中级网络工程师真题及答案解析
- 2026年《艺术概论》题库及参考答案
- CSCO结直肠癌诊疗指南(2026版)
- 山东省2025年冬季普通高中学业水平合格考试物理试题
- 托管机构老师劳动合同
- Unit5WhataDeliciousMeal!SectionA1a-1d课件人教版八年级英语下册
- 2026年银行从业资格《个人贷款》真题及答案解析
- 教科版小学科学二年级上册和下册【全册】教学课件上下共两册
评论
0/150
提交评论