CMM解释器项目文档.docx
- 文档编号:2850300
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:17
- 大小:732.17KB
CMM解释器项目文档.docx
《CMM解释器项目文档.docx》由会员分享,可在线阅读,更多相关《CMM解释器项目文档.docx(17页珍藏版)》请在冰豆网上搜索。
CMM解释器项目文档
CMM解释器项目文档
一、背景
完成小组的基本信息:
姓名
学号
分工内容
二、文法描述
粗体文字表示终结符,其余为非终结符,write(“(.)*”);为字符串输出,双引号内可以为除引号外任意字符
program->block
block->{declsstmts}
decls->declsdecl|ε
decl–>typeid;
type->type[num]|basic
stmts->stmtsstmt|ε
stmt->loc=bool;
|if(bool)stmt
|if(bool)stmtelsestmt
|while(bool)stmt
|dostmtwhile(bool);
|read(loc);
|write(loc);
|write(“(.)*”);
|block
loc->loc[bool]|id
bool->bool||join|join
join->join&&equality|equality
equality->equality==rel|equality<>rel|rel
rel->expr
expr->expr+term|expr-term|term
term->term*unary|term/unary|unary
unary->!
unary|-unary|factor
factor->(bool)|loc|num|real|true|false
三、系统分析和设计
包括系统的概要设计、详细设计和核心算法说明及分析,系统所采用的开发工具等。
1.系统概要设计:
本系统采用Java语言编写。
系统源代码由五个包构成。
inter包中的代码用于解释执行cmm语言中用到的赋值、流程控制、输入输出语句和表达式运算。
lexer包中的代码用于词法分析过程,包括cmm源代码的扫描,初始化cmm语言中的关键字、常用运算符,以及常量。
main包中的代码用于生成可视化界面,包括初始的logo,welcome对话框以及主界面。
parser包中的代码用于语法分析以及cmm源程序的解释执行。
symbols包中的代码用于初始化cmm支持的基本类型,表示数组,以及记录已声明的变量和数组标识符。
2.系统详细设计:
inter包中除Node外所有类都继承抽象类Node,Node类中定义了一个属性:
即当前的行号,一个构造函数用于初始化行号,一个具体方法用于报告错误:
error()以及一个抽象方法:
getTreeNode()。
Node类有两个抽象子类:
Stmt类和Expr类,Stmt类中有抽象方法:
execute(),Node类中有抽象方法:
getValue()。
所有对应语句的类,如:
If、Else、While等都继承Stmt,并重写getTreeNode()和execute()方法。
所有对应表达式的类,如:
Arith、Constant、Id等都继承Expr,并重写getTreeNode()和getValue()方法。
lexer包中共有6个类。
Lexer类用于扫描输入框中输入的源代码并解析得到token完成词法分析。
Num类和Real类分别用于实例化整数和实数,并记下相应的值。
类Token用于实例化扫描到的token。
Tag类用于初始化常用的token的标签,方便语法分析时的匹配。
Word用于初始化CMM语言中的关键字和实例化扫描到的标识符。
main包中共有5个类。
CreatGUI中包含main()方法,是程序的入口。
Editor用于生成主界面中支持语法高亮的编辑区。
GUI完成对主界面的设计,包括页面布局以及事件监听器。
ImageJPanel类用于生成程序启动时的logo。
parser包中的Parser类用于语法分析和解释执行,通过调用lexer得到token,再递归下降对得到的token逐一匹配,定义的cmm语言的起始为一个block,调用语法分析得到的Block对象的getTreeNode()方法得到语法树的根结点,调用其execute()方法对cmm源程序解释执行。
语法分析主程序示意图
symbols包中有3个类。
Type类用于初始化cmm语言中的基本类型,有两个静态方法:
numeric()用于检验一个类型是否数值类型和max()用于确定运算中各数值类型的关系,如:
整数和实数相加得到的结果是实数。
Array继承Type类,用于实例化数组类型,记录了数组的类型和大小。
Map类用于建立记录已声明变量标识符的哈希表。
3.核心算法:
编译原理中学到的递归下降分析法:
对文法的每一非终结符号,都根据相应产生式各候选式的结构,为其编写一个子程序(或函数),用来识别该非终结符号所表示的语法范畴。
递归下降分析法是最常用到的自顶向下分析法。
Java语言的面向对象思想:
继承和多态。
生成语法树和解释执行程序用到了java的继承和多态,在递归下降分析的过程中调用特定类的getTreeNode()方法获得树的结点,调用Stmt类的子类的execute()方法执行语句动作,Expr类的子类的getValue()方法来获得表达式的值。
4.系统开发工具:
MyEclipse8.0
四、测试用例和测试结果
测试用例
//冒泡排序
{
int[10]x;
inti,n;
intj;
inttemp;
i=10;
n=10;
while(i>0){
read(x[10-i]);
i=i-1;
}
//**第一次输出**
i=0;
write("beforesort
");
while(i write(x[i]); i=i+1; } //**********冒泡排序************ i=0; j=0; while(i j=i+1; while(j if(x[i]>x[j]){ temp=x[i]; x[i]=x[j]; x[j]=temp; } else ; j=j+1; } i=i+1; } //***第二次输出*** i=0; write("aftersort "); while(i write(x[i]); i=i+1; } } //阶乘 { inti,s; read(i); s=i; while(i>1) { i=i-1; s=s*i; } write("theresultis: "); write(s); } //删除数组下标为偶数的数,数组下标测试 { int[10]v; inti,j,k,l,n; i=1;j=0;k=0;l=0;n=10; while(l { read(v[l]); l=l+1; } while(i<=n) { v[j]=v[i]; j=j+1; i=i+2; } n=j; while(k { write(v[k]); k=k+1; } } //运算,整形和实形的隐式转换 { realm,n; inti,j; read(i); j=5; n=i/3; m=3.5; if(i+1 elsewrite(n); read(n); n=m+n; write(n); } //错误测试 { int[2][2]a; //重名错错误 //reali; inti; //除零错误*/ //i=3/0; //数组越界错误一维*/ //a[1][2]=3; //数组越界错误二维*/ //a[2][1]=3; //未初始化错误*/ //write(i); //未声明错误*/ //write(u); //类型错误 //inti; //realu; //i=3.0/2; } 测试结果 冒泡排序: beforesort 54 23 99 201 21 4 22 545 22 1 aftersort 1 4 21 22 22 23 54 99 201 545 阶乘: 21! =theresultis: -1195114496(越界) 10=theresultis: 3628800(正常) 删除数组下标为偶数的数,数组下标测试: 2 4 6 8 0 运算类型转换: (输入两个数,一个为整数,一个为实数) 2 6.4 错误测试: 语法错误 未声明 未实例化 数组越界 重复声明 除0错误 类型错误 测试文档到此结束,我们测试了所有的错误出现,以及所有功能实现。 (包括注释,以及所有关键字) 五、使用说明(可选) 关于我们的图形界面和功能 本小组程序界面设计实现主要由小组成员周荣博完成。 界面未使用任何图形化编程工具,完全手工输入代码实现。 1.界面初窥: 运行程序之初,你会看到本程序作者的DIY图片以及版权申明: 接下来进入程序主体: (1) 2.程序界面的结构 由 (1)很容易发现,程序由4块组成: 顶部的工具栏,左边的输入功能区,右边的输出功能区,底部的异常状态区。 在工具栏上方我们设有菜单项目,包含了工具栏中没有的一些重要功能。 菜单 其中值得说明的是style菜单项: 我们程序提供了风格选择的功能,其中windows,windowsclassic,napkin这些风格是jdk中自带的,而mac风格是网上个人组织制作的,被我用javabuildpath的方式以library加入到工程中来。 Windows: Windowscalssic: Napkin就是默认风格 Mac: (由于mac风格是个人制作的,所以在与其他风格之间切换有一定的bug,所以在mac下屏蔽了一些图形功能) 3.工具栏 打开清楚词法语法解释最大化正常化about 最大化效果: 4.输入区 输入区分3个标签: Welcome,Coloredinput,Explore Welcome: 在进入程序的时候用来知道用户,并且提供一个示例。 同时它还是一个编辑文本框,但是它是一个轻量级的TextArea。 Coloredinput: 这是一个带有语法高亮显示的强类型文本编辑框 Explore: 这是一颗读取当前计算机文档系统结构的树,可以当成资源管理器,来打开文档文件,方便快捷! ! 5.输出区和异常出错区 输出区,依然是3个标签页分表输出词法,语法,解释结果。 问题出错异常区: 界面介绍到此结束,我的界面感觉还有很多可以改进,而且非常得简陋,但是我觉得界面的设计在于花时间去构思去调试,用手写java代码一样可以出好界面。 最后我想引用桂浩老师的一句话: “谁说java做不出好看的界面? 做不出好看的界面是你自己的事,不要怪java。 ” 六
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CMM 解释 项目 文档