编译原理实验报告词法分析+语法分析.docVIP

  • 17
  • 0
  • 约2.55万字
  • 约 36页
  • 2017-09-02 发布于浙江
  • 举报

编译原理实验报告词法分析+语法分析.doc

编译原理实验报告词法分析语法分析

计算机专业类课程 实验报告 课程名称:编译原理 学  院:计算机科学与工程 专  业:计算机科学与技术 学生姓名:林怡 学  号:2012060020023 指导教师:陈昆 日  期:   2015年6月5日 电 子 科 技 大 学 实 验 报 告 实验一 实验名称:词法分析器的设计与实现 实验学时:4 实验内容和目的: 实验内容: 求n!的极小语言的源程序作为词法分析的输入程序,根据给定的文法对其进行词法分析并将单词符号与种别组成的二元式按指定格式输出到out.dyd文件中,同时将词法错误输出到error.err文件中。 其中二元式文件out.dyd 有如下要求: (1)二元式形式: 单词符号(种别 (2)每行后加上 “(((...(EOLN(24” (3)文件结尾加上 “(((...(EOF(25” 出错文件error.err中错误信息格式如下: ***LINE:行号((错误性质 实验目的: 通过设计并实现一个词法分析器,了解和掌握词法分析程序设计的原理及相应的程序设计方法,同时提高编程能力。 实验原理: 1、编译程序要求对高级语言编写的源程序进行分析和合成,生成目标程序。词法分析是对源程序进行的首次分析,实现词法分析的程序为词法分析程序。像用自然语言书写的文章一样,源程序是由一系列的句子组成的,句子是由单词符号按一定的规则构成的,而单词符号又是由字符按一定规则构成,因此,源程序实际上是由满足程序语言规范的字符按照一定的规则组合起来构成的一个字符串。 2、词法分析的功能是从左到右逐个地扫描源程序字符串,按照词法规则识别出 单词符号作为输出,对识别过程中发现的词法错误,输出相关信息。 3、单词符号是程序语言最基本的语法符号,为便于语法分析,通常将单词符号分为五类(标识符,基本字,常数,运算符,界符),而本次实验中单词符号与其对应的种别如下图所示: 4、状态转换图是有限有向图,是设计词法分析器的有效工具。图中的节点代表状态,节点间的有向边代表状态之间的转换关系,有向边上标记的字符表示状态转换的条件。本实验中的状态转换图如下图所示: 5、本程序所设计主要方法及作用如下: ① int isletter(char c) 判别字符c是否为字母 ② int isdigital(char c) 判别字符c是否为数字 ③ int match_reserve(char *p) 匹配字符串p是否为保留字 ④ void match_symbol(const char *p) 匹配字符串p是否为标识符 ⑤ void match_double_operator(char *p) 匹配字符串p是否为双运算符 ⑥ void match_single_operator(char *p) 匹配字符串p是否为单运算符 ⑦ void outfile() 将词法分析所得的二元式按固定格式写入文件out.dyd 实验器材(设备、元器件) C语言+windows7+CodeBlocks+gcc 实验步骤: 1、将源程序保存到in.pas文件中; 2、从in.pas文件中读取字符串保存到buf数组,若整个输入文件已读取完毕,程序结束; 3、每次从buf数组中读入一个字符,若已读到buf最后一个字符,返回第2步继续执行; 3-a 如果该字符是字母或数字将其连接到temp字符串尾部,buf索引index加1,判断buf[index]是否为0,若为0说明temp字符串为一完整单词,跳到第4步执行;若不为0,继续执行第3步; 3-b 如果读入的不是字母/数字,首先判断并匹配temp中是否已出现保留字/标识符,如果没有,通过预读buf中的下一个字符来进一步判断temp中存放的是单运算符还是双运算符或换行符,最终写入相应二元式,返回第3步继续执行; 4、判断temp字符串是否为保留字,若不是保留字,进一步判断它是标识符还是常量,最终生成相应二元式,返回第3步继续执行; 【注】 这里省略了对于非法字符的出错处理 实验数据及结果分析: 测试程序如图,在测试程序中故意添加了一些词法错误如:将保留字写成beg in,常数1kkk,符号 !=,用于检测本实验程序的查错能力; 程序运行完毕,得到out.dyd文件,内容如图所示: 报错文件error.err内容如图: 由上图可以看出,本词法分析程序,可以识别部分非法的常数以及字母表以外的非法字符,但对于将begin写成beg in这一类的词法错误,并未做处理,而是将其放到语法分析的部分来处理。 实验结论、心得体会和改进

文档评论(0)

1亿VIP精品文档

相关文档