• 静思
  • 吴言片语
    • 吴言
    • 片语
    • 杂七杂八
  • 死于青春
    • 一路走好
  • 乌合麒麟
  • 纪念
    • 5.12
    • 3.23
  • GitHub
    • A List of Post-mortems
    • The Art of Command Line
  • 关于
    • Privacy Policy

程序员的信仰

金鳞岂是池中物,一遇风云便化龙

HOME » 学校生活 » Mini Java编译器(五)

Mini Java编译器(五)

2005 年 3 月 16 日 @ 上午 11:44 by Jay | 被踩了 3,161 脚

TOC

Toggle
  • 六、系统的设计和实现
    • compiler包
    • token包
    • common包
      • 继承树(HierarchyTreeNode和HierarchyTree)
      • 符号表(TokenTable和Identifier)
    • automation包
    • exception包
    • identifier包
    • type包
    • ui包
      • ClassTreeModel
      • TokenTableModel
      • MemoryTableModel

六、系统的设计和实现

这个编译器是用Java写的,基于OO技术,所以整个系统是尽量用OOD设计的。OOD中最小的设计粒度是类,本系统的大致类结构如下

 

compiler包

整个系统的根,UML图如下:

o_compiler

 

token包

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

o_token

 

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图如下:

o_common

 

automation包

封装了词法分析器和语法分析器,UML图如下:

o_automation

 

exception包

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

o_exception

 

identifier包

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

o_identifier

 

type包

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

o_type

 

ui包

封装用户界面

 

ClassTreeModel

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

 

TokenTableModel

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

 

MemoryTableModel

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

UML图如下:

o_ui


-- EOF --

除非注明(如“转载”、“[zz]”等),本博文章皆为原创内容,转载时请注明: 「转载自程序员的信仰©」
本文链接地址:Mini Java编译器(五)

分享

  • 点击分享到 Facebook (在新窗口中打开) Facebook
  • 点击以分享到 X(在新窗口中打开) X
  • 更多
  • 点击分享到Reddit(在新窗口中打开) Reddit
  • 点击分享到Telegram(在新窗口中打开) Telegram
  • 点击以在 Mastodon 上共享(在新窗口中打开) Mastodon

赞过:

赞 正在加载……

相关

Today on history:

【2012】2012年政府工作报告 脱水版
【2009】如何让Netbeans以英文模式启动
【2006】程序员是如何捕猎大象的 [zz]
Posted in: 学校生活 Tagged: java, 作业
← Mini Java编译器(四)
Mini Java编译器(六) →

android (9) apple (20) augmentum (9) Beijing (21) bt (8) career (28) coding (38) firefox (10) google (36) hibernate (11) ibm (11) iphone (10) java (93) linux (16) m$ (26) mac (58) macos (27) nazca (9) olympics (8) oo (8) playstation (10) rip (8) Shanghai (39) spring (9) tips (45) tommy emmanuel (8) ubuntu (12) usa (23) windows (9) 北航 (17) 博客 (29) 吐槽 (8) 周末 (9) 和谐社会 (26) 小资 (11) 愤青 (40) 方言 (10) 朋友 (77) 歌词 (8) 烟酒不分家 (18) 爱国 (19) 爱情 (8) 犯二 (15) 破解 (8) 足球 (11)

烫手山芋

  • 再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~ - 被踩了 27,044 脚
  • 生活,就是一个期待跟着一个期待 - 被踩了 21,355 脚
  • 星巴克饮品缩写大全(Starbucks Drink ID Codes)[zz] - 被踩了 18,399 脚
  • 从一个全角冒号说一下我为什么不感冒iOS - 被踩了 14,283 脚
  • 有关Character.isLetter()和Character.isLetterOrDigit() - 被踩了 13,587 脚

刚拍的砖

  • leo 发表在《再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~》
  • 花 发表在《再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~》
  • 无名氏 发表在《从一个全角冒号说一下我为什么不感冒iOS》
  • Jay 发表在《Mac OS geek级问题》
  • Wei Wang 发表在《再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~》

随便看看

  • “麦莎”来了20 年 ago
  • A beginners guide to Dependency Injection [转载自TSS]10 年 ago
  • 架构腐化之谜 [zz]10 年 ago
  • 翻译Nice文档9 年 ago
  • 适配器模式(Adapter)9 年 ago

文以类聚

光阴似箭

其他操作

  • 登录
  • 条目 feed
  • 评论 feed
  • WordPress.org

Copyright © 2025 程序员的信仰.

Jay's Omega WordPress Theme by Jay

 

正在加载评论...
 

    %d