hust编译原理实验报告2.doc

  1. 1、本文档共40页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档