本学期的解释器构造课程主要是自己实现解释器。相应地我会在博客做好记录。
现在先附上任务书。
实验一
[实验名称]
编译工具的使用
[实验内容和步骤]
1、阅读文献资料,了解编译工具的发展及功能。
2、选择JavaCC或者Antlr,具体了解其使用方法,包括环境安装、编译工具的语法及使用、实例分析。
3、给出使用实例,完成对CMM语言的词法语法分析器的自动实现。
4、总结上述内容,完成学习笔记。
[提交内容]
提交内容1:JAVACC或Antlr的学习笔记
提交内容2:CMM语言的词法语法分析源代码,以及可运行程序和模板文件。
实验二
[实验名称]
CMM语言词法分析
[实验目的和要求]
设计并编制调试一个分析单词的词法分析器,加深对词法分析原理的理解。
从输入的源程序中,识别出各个具有独立意义的记号,包括保留字、标识符、常数、运算符、分隔符等,并依次输出各个记号序列。如果出错(即不是语言可以识别的记号),则输出error。
输入形式为键盘输入或文件输入。
输出的结果需要呈现出词法分析器对输入内容分析的结果,例如《编译原理及实践》第56的“程序清单2-4”。
[实验内容和步骤]
1、对词法现象的形式化描述, 附上所定义的种别码表。
2、程序结构说明,包括程序的总体结构,以及主要的数据结构、算法说明。
3.设计充分的测试数据,给出调试的数据及结果。
[实验总结]
总结本次实验内容,对所完成的结果进行分析评价。(包括在设计、实现中遇到的问题、解决的方法,实验中用到的独到的方法和见解等等。评述设计与实现的优缺点,存在的问题等)
[提交内容]
提交内容:词法分析的源码、可执行程序。
实验报告
实验三
[实验名称]
CMM语言语法分析
[实验目的和要求]
设计并编制调试一个分析CMM程序结构的语法分析器,加深对语法分析原理的理解和应用。
在实验一的基础上,以单词序列为输入,分析单词序列构成的语法结构,给出相应的输出,并进行一定的错误处理。
和实验一进行整合,输入为任意的CMM源程序文件,输出是语法树或者类似可以说明语法成分的结构形式(可以输出到文件或者输出到屏幕上)。
[实验内容]
1、编译方法说明
给出CMM语言的文法。根据所采用的实现语法分析的方法,对文件进行相应的修改。
说明使用的语法分析方法,如递归下降法、预测分析表法或LR方法,给出所采用方法的一些分析过程。
2、程序结构说明,包括程序的总体结构,以及主要的数据结构、算法说明。
3.程序调试,设计充分的测试数据,调试的数据及结果。
[实验总结]
对程序设计及编写中的情况及采取的措施进行总结,给出经验。
你对你程序的评价(分析存在的问题、设计与实现的优缺点)。
[实验总结]
总结本次实验内容,对所完成的结果进行分析评价。(包括在设计、实现中遇到的问题、解决的方法,实验中用到的独到的方法和见解等等。评述设计与实现的优缺点,存在的问题等)
[提交内容]
提交内容:语法分析的及源码及执行程序。
语法分析的实验报告。
实验四
[实验名称]
CMM语言解释器
[实验目的和要求]
1设计并编制调试一个实现CMM程序结构的解释器,加深对编译技术的理解和综合应用。在实验一、二的基础上,对输入的满足CMM语法的源程序文件,进行解释执行。
2、系统的输入:CMM源程序
系统的输出:可选择是否打印编译过程中的每个阶段的输出结果,但是至少需要能够打印出代码生成部分的结果并解释执行得到结果。
3、以开发小组形式完成,每组人员不得超过5人。
4、可以在CMM语言上增加更多的功能,但是不能减少附录一中的语言现象。
[实验内容]
1.设计:编译方法说明
给出CMM语言的词法现象和语法现象的形式化描述。
指出所使用的语法分析方法,并根据使用的语法分析方法,给出相关的中间推导步骤(如:如果采用递归下降法则给出BNF语法图、如采用预测分析表法则给出预测分析表等)。
说明语义分析中采用了具体的属性文法,进行何种分析。
采用的中间代码形式对语义分析的中间结果给出输出。
2.代码实现:要求结构清晰、可读性好。
3.调试:给出较充分的测试用例,以及测试结果(注意数据的多样性及覆盖性)。
[提交内容]
提交内容
小组成员学号、姓名,以及各成员的任务分工。
完整的实验报告、源码和测试数据。
[实验总结]
对程序设计及编写中的情况及采取的措施进行总结。
你对你所完成的结果如何评价?(评述设计与实现的优缺点,存在的问题等)
[评分指标]
1、界面友好,功能完整。(50%)
2、实验报告完整、描述清晰正确;和源代码一致;源码组织合理、结构清晰,可读性好;(30%)
3、具有测试数据,测试充分。(10%)
4、其他方面,如有额外功能实现、好的设计思想等。(10%)
附录1 CMM(C Minus Minus)语言
一、实验语言的定义
CMM语言为C语言的一个子集:
语言结构:顺序结构(赋值语句、输入、输出)、选择语句(if-else)、循环结构(while)。这些语句结构和C语言的结构一样,允许嵌套。
表达式局限于关系表达式和算术表达式,运算的优先级为:算术运算、关系运算,并服从左结合规则。
算术表达式包括整数和实数上的运算、变量以及“()”、“”、“+”、“-”、“/”,运算符的优先级顺序为:“()”大于“”和“/”大于“+”和“-”。
关系运算符包括:“<”、“==”、“<>”。
一条语句以“;”结束;程序由一条语句或者由“{”和“}”嵌套表达的复合语句。
支持多行注释(使用“/”和“ ”)
支持数组运算,数组的下标必须是正整数,使用“[”和“]”表示数组下标。
变量的使用之前需要先声明,声明的方式和C语言一样。
保留字 :
If
else
while
read
write
int
real
特殊符号:
*
<>
(
)
;
{
}
/*
*/
[
]
<>
(
)
;
{
}
/*
*/
[
]
其它:
十进制的整数与实数
标识符(由数字、字母和下划线组成的串,但必须以字母开头、且不能以下划线结尾的串)
二、实验语言的扩展
以上为需要实现的基本实验语言要求,可以在此基础上进行更多的扩展,以分析更多的类型和结构,如方法、指针等。
所有扩充的功能作为可以另外加分。
附录2 实验二至实验三文档规范
实验题目
一、背景
完成人(完成组)的基本信息,包括姓名、学号、班级、提交日期。如果以小组完成,则需要给出分工说明。
完成的任务说明。
二、功能实现描述
描述实现的方法、结构和技术等。
三、使用说明(可选)
对运行所需要的环境及基本使用方法进行简要说明。
四、参考资料
附录3 课程项目(实验四)提交文档规范
CMM解释器项目文档
一、背景
完成小组的基本信息:
姓名 学号 分工内容
二、文法描述
给出所实现的CMM语言的完整的文法描述
三、系统分析和设计
包括系统的概要设计、详细设计和核心算法说明及分析,系统所采用的开发工具等。
四、测试用例和测试结果
列出用于测试的关键数据,及测试结果(可以将部分测试结果进行截屏)
五、使用说明(可选)
对运行所需要的环境及基本使用方法进行简要说明。
六、小结
1. 总结本次工作,包括对完成的解释器的性特色分析、功能分析、测试结果的分析等;
2. 在完成项目中所遇到的问题及解决方法;
3. 设计实现的经验和体会。
七、参考资料
列出参考资料的信息