编译原理实验报告-合肥工业大学版.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理实验报告-合肥工业大学版

编译原理实验报告 合肥工业大学计算机科学与技术 完成日期:2013.6.3 实验一 词法分析设计 实验功能: 对输入的txt文件内的内容进行词法分析: 由文件流输入test.txt中的内容, 对文件中的各类字符进行词法分析 打印出分析后的结果; 二、程序结构描述:(源代码见附录) 利用Key[]进行构造并存储关键字表;利用optr[]进行构造并存储运算符表;利用separator[]进行构造并存储分界符表; bool IsKey(string ss) {}判断是否是关键字函数若是关键字返回true,否则返回false; bool IsLetter(char c) {}判断当前字符是否字母,若是返回true,否则返回false; bool IsDigit(char c) {}判断当前字符是否是数字,若是返回true,否则返回false; bool IsOptr(string ss) {}判断当前字符是否是运算符,若是返回true,否则返回false; bool IsSeparator(string ss) {}判断当前字符是否是分界符,若是返回true,否则返回false; void analyse(ifstream in) {}分析函数构造; 关系运算符通过switch来进行判断; 三、实验结果 实验总结: 词法分析的程序是自己亲手做的,在实现各个函数时花了不少功夫, 要考虑到什么时候该退一字符,否则将会导致字符漏读甚至造成字符重复读取。 在实现行数和列数打印时要考虑到row++和line++应该放在什么位置上才可以,如当读取一个\n时line要增加一,而row需要归0处理,在读取某一字符串或字符后row需要加一; 对于关系运算符用switch结构进行选择判断即可解决一个字符和两个字符的运算符之间的差异; 将自己学过的知识应用到实践中是件不怎么容易的事情,只有亲身尝试将知识转化成程序才能避免眼高手低,对于知识的理解也必将更加深刻。 实验二 LL(1)分析法 实验原理: 1、写出LL(1)分析法的思想:当一个文法满足LL(1)条件时,我们就可以为它构造一个不带回溯的自上而下的分析程序,这个分析程序是有一组递归过程组成的,每个过程对应文法的一个非终结符。实现LL(1)分析的一种有效的方法是使用一张分析表和一个站进行联合控制。预测分析表是一个M[A,a]形式的矩阵,存储着分析规则;栈STACK用于存放文法符号。从栈顶取符号,按照分析表给出的规则进行有步骤的分析。 实验要求实现的文法: (1)E-TG (2)G-+TG|—TG (3)G-ε (4)T-FS (5)S-*FS|/FS (6)S-ε (7)F-(E) (8)F-i 程序结构: 各个模块: (1)定义部分:定义常量、变量、数据结构。? (2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);? (3)控制部分:从键盘输入一个表达式符号串;? (4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。 程序各个部分的实现: Vn[]存储非终结符数组; Vt[]存储终结符数组; char strToken[Length];//存储规约表达式 struct LL//ll(1){char *c}分析表的构造字初始化 Class stack实现栈的要求功能:初始化,判断空满,入栈出栈等; Run()函数实现LL(1)文法分析的函数:先将表达式字符入栈,#最先入栈底,依次取栈顶符号,查和符号栈和分析表,进行相应的操作。 实验结果: 测试方法:运行程序,输入需要分析的语句 测试结果如下: 实验总结: 出现下列两种情况说明遇到了语法错误: 栈顶的终结符与当前的输入符号不匹配。 非终结符A处于栈顶,面临输入符号为a,但分析表M中M[A,a]为空。发现错误后要尽快的从错误中恢复过来使分析能继续进行下去。 2、对于符号的入栈出栈,哪个应该先入栈,栈顶是哪个元素需要搞清楚,不然得到的结果肯定不对。 实验三 LR(1)分析法 一实验原理 LR(1)分析法实验设计思想及算法 (1)总控程序,也可以称为驱动程序。对所有的LR分析器总控程序都是相同的。 (2)分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表将不同,分析表又可以分为动作表(ACTION)和状态转换(GOTO)表两个部分,它们都可用二维数组表示。 (3)分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。 分析器的动作就是由栈顶状态和当前输入符号所决定。 二、程序结构 LR分析器由三个部分组成: 其中:SP为栈指针,S[i]为状态栈,

文档评论(0)

shenlan118 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档