编译原理实验题目
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理
课程设计指导书
题目一基于语法制导翻译的表达式转换编译器
一、设计目的
通过本课程设计获得对实际编译器的构造原理、过程和方法的感性认识,全面掌握语法制导翻译技术。
二、设计内容
采用语法制导翻译模式设计一个包含词法分析、语法分析、符号表管理、错误处理及输出等功能模块的、由中缀表达式到后缀表达式的完整编译器。该翻译器的规格说明如下:
start → list eof
list → expr |
expr → expr + term { print(‘+’) }
| expr –term { print(‘-’) }
| term
|ε
term → term * factor { print(‘*’) }
| term / factor { print(‘/’) }
| term div factor { print(‘DIV’) }
| term mod factor { print(‘MOD’) }
factor → ( expr )
| id { print( ) }
| num { print( num.value ) }
三、设计要求
1、使用模块化设计思想来设计该编译器;
2、词法分析模块用于读入输入串,并将其转换成供语法分析模块使用的记号流。其中包括滤掉空格和注释、识别常数、识别标识符和关键字等功能;
3、要求在语法分析模块中利用语法制导翻译技术完成具体的中缀表达式到后缀表达式的翻译,其中包括按前述翻译器的规格说明构建对应表达式、项、因子的非终结符expr、term 和factor的函数以及检查记号是否匹配的函数;并在不匹配时调用错误处理模块;
4、要求符号表管理模块主要完成符号表对应数据结构的具体实现功能;
5、错误处理模块负责报告错误信息及位置,并终止分析过程;
6、输出模块完成翻译后所得到的后缀表达式的输出。
四、运行结果
1、从键盘输入任意中缀表达式,如:
4 -
5 *
6 DIV 4 + 8 MOD 2
输出相应的后缀表达式:
456*4DIV-82MOD+
1、若键盘输入串为非中缀表达式时,如:
4 !+*
5 -
6 DIV 4 + 8 MOD 2
输出相应语法错误报告信息,并停止语法分析,如:
line 1 : compiler error !
五、提示
1、将各功能模块设计为独立的源程序文件;
2、建立一个全局头文件,将本设计所需要用到的系统头文件的打开、一些必要的宏定义
和全局变量的声明信息放在该全局头文件中;
3、将本设计所有文件加入一个工程文件。
六、分析与讨论
1、如何修改错误处理模块,使得编译器在发现错误后能跳过出错语句,继续进行语法分析;
2、试使用手工构造和自动生成相结合的方法来完成本课程设计;
3、仔细研读附录C有关“PL/0语言词法分析器的手工构造和自动生成”的设计内容,并通过借鉴PL/0语言词法分析器的设计方法和具体实现技术,对本课程设计的综合设计进行优化。
题目二说明语句的词法分析器
一、设计目的
了解的基本构造原理,掌握词法分析程序的手工构造及自动构造方法。
二、设计内容
根据PASCAL语言的说明语句形式,用手工及自动方法构造一个对说明语句进行词法分析的程序。该程序能对从键盘输入或从文件读入的形如:
“const count=10,sum=81.5,char1=’f’,string1=”hj”, max=169;”
的常量说明串进行处理,分析常量说明串中各常量名、常量类型及常量值,并统计各种类型常量个数。
三、设计要求
1、输入的常量说明串,要求最后以分号作结束标志;
2、根据输入串或读入的文本文件中第一个单词是否为“const”判断输入串或文本文件是否为常量说明内容;
3、识别输入串或打开的文本文件中的常量名。常量名必须是标识符,定义为字母开头,后跟若干个字母,数字或下划线;
4、根据各常量名紧跟等号“=”后面的内容判断常量的类型。其中:字符型常量定义
为放在单引号内的一个字符;字符串常量定义为放在双引号内所有内容;整型常量定义为
带或不带+、- 号,不以0开头的若干数字的组合;实型常量定义为带或不带+、- 号,不
以0开头的若干数字加上小数点再后跟若干数字的组合;
5、统计并输出串或文件中包含的各种类型的常量个数;
6、以二元组(类型,值)的形式输出各常量的类型和值;
7、根据常量说明串置于高级语言源程序中时可能出现的错误情况,模仿高级语言编
译器对不同错误情况做出相应处理。
四、运行结果
1、输入如下正确的常量说明串:
const count=10,sum=81.5,char1=‘f’,max=169,str1=“h*54 2..4S!AAsj”, char2=
‘@’,str2=“aa!+h”;
输出:
count(integer,10)
sum(float,81.5)
char1(char, ‘f’)
max(integer,169)
str1(string,“h*54 2..4S!AAsj”)
char2(char, ‘@’)
str2(string,“aa!+h”)
int_num=2; char_num=2; string_num=2; float_num=1.
2、输入类似如下的保留字const错误的常量说明串:
Aconstt count=10,sum=81.5,char1=‘f’;
输出类似下面的错误提示信息:
It is not a constant declaration statement!
Please input a string again!
3、输入类似如下含常量名或常量值错误的常量说明串:
const count=10,12sum=81.5,char1=‘ff’,max=0016;
输出类似下面的错误提示信息:
count(integer,10)
12sum(Wrong! It is not a identifier!)
char1(Wrong! There are more than one char in ‘’.)
max(Wrong! The integer can’t be started with ‘0’.)
int_num=1; char_num=0; string_num=0; float_num=0.
4、其他类型的错误处理情况(略)。
五、提示
本课程设计重点有三个:一是作为常量名的标识符的识别;二是如何根据“=”后出现的内容来判断常量类型;三是对各种错误的处理。难点是对整型和实型常量的判断必须综合考虑多种可能情况。
提示:
1、用指针或数组与指针相结合来处理输入的常量说明串;
2、对整型和实型常量处理时,重点考虑常数中‘0’的位置。