- 1、本文档共40页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
hust编译原理实验报告2
《编译原理》
院 系 计算机科学与技术
专 业 计算机科学与技术
班 级 CS1101
学 号
姓 名
指导教师 周时阳
2014 年 7月 2日目录
实验一 1
一、问题描述 1
二、数据结构及算法设计 1
1、C语言简单词法 1
2、标识符与运算符 2
三 程序实现 10
源代码 10
四、程序测试 16
截图 16
五、复杂度分析 17
实验二 17
1、问题描述 17
2、系统设计 17
2.1算符优先分析法的思想及其原理 17
2.2算符优先分析算法 19
2.3 构建算符优先关系表 23
2.4 出错处理 23
3 系统实现 24
3.1 程序流程图 24
3.2 构建算符优先关系表 24
3.3实验截图 26
4 程序实现 26
实验一
一、问题描述
选择计算机高级程序语言之一 —— C语言,运用恰当的词法分析技术线路,设计和实现其对应的词法分析器。
对C语言的词法按照正则文法或正则式→NFA→DFA→min DFA→程序设计;能够跳过程序中的注释和空白、换行符等没有意义的部分;遇到无法确认的符合能够报告错误,然后跳过这个错误,继续分解剩下的部分;分析后的结果存放到磁盘文件中。
二、数据结构及算法设计
1、C语言简单词法
(1)关键字:main int char long if else for while void
所有的关键字都是小写。在设计测试程序时所涉及的关键字应该在以上范围内才能被识别,否则将作为标识符处理。
(2)运算符和界符:: = + - * / = = = ; ( ) ++ ! !=
上面所包含的运算符与界符不是很全面,因此无法识别一些复杂的运算符,例如、||、%等。
(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:
ID=letter(letter|digit)*
NUM=digit digit*
标识符由字母和数字组成,且首字符必须为字母;这里只对整型常数进行识别,浮点数数据在识别过程中会对小数点进行报错。
(4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM、运算符、界符和关键字,制表符和换行符等都只是对程序起到一个可读性的作用,在词法分析中没有实际意义,因此词法分析阶段通常被忽略。
(5)注释由/**/及其内部内容组成,在词法分析阶段也对程序的分析没有实际意义,因此也要被忽略。
关键字的判定规则是先进行标识符的识别,识别到最终状态后,在关键字数组中查找,看此标识符是否为关键字,如果是则将其划为关键字一类,否则作为标识符。
因此,此正规式的主要分析在标识符ID中会详细分析,在分析完后只要通过一个strcmp函数就可以分辨出是否关键字。
2、标识符与运算符
各种单词符号对应的种别码
单词种别是语法分析需要的信息,而单词自身的值则是编译其他阶段需要的
信息。因此词法分析器的输出结果表示为:
(单词种别,单词自身的值)
单词的种别采用整数编码表示,下面给出了词法分析器的各个单词符号的
种别码。
Start:1
If:2
Then:3
Int:4
While:5
Do:6
For:7
End:8
字母:10
数字:11
*:13
/:14
+:15
-:16
::17
:20
:23
=:25
;:26
(:27
):28
!:0
2.1标识符ID:
标识符ID的正则式表示如下:
ID= letter (letter| digit)*
letter= a~z
digit= 0~9
根据以上正则式画出NFA如下图。
图 1 ID的NFA表示
下面将这个NFA转换为DFA。利用子集构造法,构造上述NFA的DFA步骤如下:
(1)首先计算?—closure(1),令0= ?—closure(1)={1},0未被标记,它现在是子集族C的唯一成员。
(2)标记0;令1= ?—closure(move(0,letter))={2,3,4,6,9},将1加入到C中,1未被标记。令2= ?—closure(move(0,digit))=Ф,不再计算。
(3)标记1;计算3= ?—closure(move(1,letter))={3,4,5,6,8,9},将3加入到C中,它未被标记。计算4= ?—closure(move(1,digit))={3,4,6,7,8,9},将4加入到C中,它未被标记。
(4)标记3;计算?—closure(move(3,letter))={3,4,5,6,8,9},即3,它
文档评论(0)