服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

mini java编译器(五)


  六、系统的设计和实现
这个编译器是用java写的,基于oo技术,所以整个系统是尽量用ood设计的。ood中最小的设计粒度是类,本系统的大致类结构如下


 

compiler包
整个系统的根,uml图如下:








 

token包
封装了所有的可识别单词,采用一符一码,单词对应的码定义在token类中,该类是抽象类,仅作继承用。该包uml图如下:










common包
公用包,封装了一些公用的对象和数据结构:

hierarchytree类和hierarchytreenode类定义了继承树结构;

memorytable类和memorycell类定义了需要内存分配表;

locatable接口和locator类定义了定位器;

tokentable定义了符号表;


 

继承树(hierarchytreenode和hierarchytree)
封装类之间的继承属性,数据机构上使用一棵n叉双向树,可以由父节点直接访问子节点,也可以由子节点直接访问父节点。

java不支持多继承,mini java连接口继承(implements)也不支持,所以每个子节点只有一个父节点,而一个父节点可以有n个子节点。

虽然mini java规范中没有明确定义,但实现上仿照java将object类作为继承树的根节点。

具体实现时定义了一棵“伪树”,即存储结构为表,但以附加的level属性区分父节点与叶结点。

hierarchytreenode封装了节点,hierarchytree则封装了和树有关的一些操作(插入、查找)。


 

符号表(tokentable和identifier)
因为只有以下几种情况会出现“标识符已定义”、“类已定义”或“方法已定义”语法错误:

同一个文件中声明了相同名称的类

同一个类中声明了相同名称的方法

同一个类中声明了相同名称的类变量

同一个方法中声明了相同名称的变量

方法中声明了与方法参数名称相同的变量

因此我在实现时修改了符号表的内容,去掉了“level”属性,增加了“belongsto”属性,具体定义见第三部分的id_belongsto表。

common包的uml图如下:




 





automation包
封装了词法分析器和语法分析器,uml图如下:






 

exception包
封装了所有可抛出的异常,uml图如下:






 

identifier包
封装了所有标识符类别,实现typable接口的类具有类型属性,uml图如下:






 

type包
封装了所有类型,在type抽象类中提供factory()方法,使用简单工厂(simple factory)模式生成类型对象,uml图如下:






 

ui包
封装用户界面


 

classtreemodel
继承自javax.swing.tree.treemodel,可将继承树的内容显示在图形界面中


 

tokentablemodel
继承自javax.swing.table.abstracttablemodel,可符号表的内容显示在图形界面中


 

memorytablemodel
继承自javax.swing.table.abstracttablemodel,可内存分配表的内容显示在图形界面中

uml图如下:




 

扫描关注微信公众号