- 1、本文档共4页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理课程实验题目
编译原理实验题目
编译原理的课程实验既是培养学生理论联系实际的必要手段也是检验我们教学理念的贯彻与实现、检查教学效果、让学生展示能力的重要途径。
为了达到上述目的,作为编译原理课程的上机实验,最好是能完成一个小型语言的基本编译系统,但这需要有较好的实验条件特别是较多的实验学时(理想的情形是专门配置一个两到三周的课程设计)的支撑。对于一个只有56学时的编译原理课程的上机实验(仅为12学时),构造一个小型语言的完整的编译系统显然是不现实的;为最大程度达到教学目的,经由课程组的认真研究,将本课程实验分解为两个上机实验:1、词法分析器编制实验;2、语法制导的三地址代码生成器编制实验(第2个实验又可分解为自顶向下的语法分析器的设计与实现和三地址代码生成器的设计与实现两个实验)。通过这两个程序的编制,使学生学会和体验构造一个微型编译系统的基本框架的主要工作。
实验一:词法分析程序的设计与实现
实验目的
基本掌握计算机语言的词法分析程序的开发方法。
实验内容
编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。
实验要求
根据以下的正规式,编制正规文法,画出状态图;
标识符 字母(字母|数字字符)*
十进制整数 0 | (1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*
八进制整数 0(1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*
十六进制整数 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*
运算符和分隔符 + - * / = ( ) ;
关键字 if then else while do
根据状态图,设计词法分析函数int scan( ),完成以下功能:
从键盘读入数据,分析出一个单词。
返回单词种别(用整数表示),
返回单词属性(不同的属性可以放在不同的全局变量中)。
3.编写测试程序,反复调用函数scan( ),输出单词种别和属性。
实验环境
PC微机
DOS操作系统或 Windows 操作系统
Turbo C 程序集成环境或 Visual C++ 程序集成环境
实验步骤
根据状态图,设计词法分析算法
采用C语言,设计函数scan( ),实现该算法
编制测试程序(主函数main)。
调试程序:输入一组单词,检查输出结果。
基本测试数据
输入数据例: 0 92+data 0x3f 00 while
正确结果:这些单词的单词种别及其属性
INT10 0
INT10 92
+ _
IDN data
_
INT16 63
INT8 0
WHILE _
实验报告要求
实验报告应包括以下几个部分:
词法的正规式描述
变换后的正规文法
状态图
词法分析程序的数据结构与算法
思考题
词法分析能否采用空格来区分单词?
程序设计中哪些环节影响词法分析的效率?如何提高效率?
实验二:语法制导的三地址代码生成程序
实验目的
掌握计算机语言的语法分析程序设计与属性文法应用的实现方法。
实验内容
编制一个能够进行语法分析并生成三地址代码的微型编译程序。
实验要求
考虑下述语法制导定义中文法,采用递归子程序法,改写文法,构造语法分析程序;
考虑下述语法制导定义中语义规则,改写语法分析程序,构造三地址代码生成程序。
产生式 语义规则 S → id = E ; S.code = E.code || gen(id.place’:=’E.place) S → if C then S C.true = newlabel; C.false = S.next;
S1.next = S.next;
S.code = C.code || gen(E.true’:’) || S1.code S → while C do S S.begin = newlabel; C.true = newlabel;
C.false = S.next; S1.next = S.begin;
S.code = gen(S.begin’:’) || C.code ||
gen(E.true’:’) || S1.code || gen(‘goto’S.begin); C → E1 E2 C.code = E1.code || E2.code ||
gen(‘if’E1.place’’E2.place’goto’C.true) ||
gen(‘goto’C.false) C → E1 E2 C.code = E1.code || E2.
文档评论(0)