编译原理实验报告实验一编写词法分析程序.doc

编译原理实验报告实验一编写词法分析程序.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
编译原理实验报告 实验名称: 实验一编写词法剖析程序 实验种类: 考证型实验 指导教师: 何中胜 专业班级: 13软件四 姓 名: 丁越 学 号: 电子邮箱: 实验地址:秋白楼B720 实验成绩: 日期:2016年3月18日 一、实验目的 经过设计、调试词法剖析程序,实现从源程序中分出各样单词的方法;熟习词法剖析 程序所用的工具自动机,进一步理解自动机理论。掌握文法变换成自动机的技术及有穷自动机实现的方法。确 定词法剖析器的输出形式及表记符与重点字的划分方法。加深对讲堂教课的理解;提升词法剖析方法的实践能 力。经过本实验,应达到以下目标: 1、掌握从源程序言件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法剖析的实现方法。 3、上机调试编出的词法剖析程序。 二、实验过程 以编写PASCAL子集的词法剖析程序为例 理论部分 1)主程序设计考虑 主程序的说明部分为各样表格和变量安排空间。 数组k为重点字表,每个数组元素寄存一个重点字。采纳定长的方式,较短的重点字 后边补空格。 P数组寄存分界符。为了简单起见,分界符、算术运算符和关系运算符都放在p表中 (编程时,还应成立算术运算符表和关系运算符表,而且各有类号),归并成一类。 id和ci数组分别寄存表记符和常数。 instring数组为输入源程序的单词缓存。 outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入重点字,造k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环构造。每个循环办理一个单词;接收键盘上 送来的一个单词;调用词法剖析过程;输出每个单词的内部码。 ⑵词法剖析过程考虑 将词法剖析程序设计成独立一遍扫描源程序的构造。其流程图见图1-1。 图1-1 该过程取名为lexical 以字符k表示重点字;i 4,5)。  ,它依据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号: 表示表记符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为1,2,3, 关于表记符和常数,需分别与表记符表和常数表中已登记的元素对比较,如表中已有 该元素,则记录其在表中的地点,如未出现过,将表记符按次序填入数组  id  中,将常数 变成二进制形式存入数组中  ci  中,并记录其在表中的地点。 lexical  过程中嵌有两个小过程:一个名为  getchar  ,其功能为从  instring  中按次序拿出一个字符,并将 其指针  pint  加1;另一个名为  error  ,当出现错误时,调用这个过程, 输犯错误编号。 实践部分 全部辨别出的单词都用两个字节的等长表示,称为内部码。第一个字节为 t,第二个字节为i。t为单词的 种类。重点字的 t=1;分界符的t=2;算术运算符的 t=3;关系运算符的 t=4;无符号数的t=5;表记符的t=6 。 i为该单词在各自表中的指针或内部码值。表1-1 为重点字表;表1-2 为分界符表;表1-3为算术运算符的 i 值;表1-4为关系运算符的 i值。 重点字表 指针l 重点字 0 BEGIN 1 DO 2 ELSE 3 EN 4 IF 5 THEN 6 VAR 7 WHILE 表1-1 分界符表 指针l 分界符 0 , 1 ; 2 。 3 := 4 ( 5 ) 6 : 7 " 表1-2 算术运算符 指针l 算术运算符 10H + 11H - 20H * 21H / 表1-3 关系运算符 指针l 关系运算符 00H < 01H <= 02H = 03H > 04H >= 05H <> 表1-4 常数表和表记符表是在编译过程中成立起来的。 其i 值是依据它们在源程序中出现的次序确立的。 此外可 以依据Pascal语言子集中出现其余单词状况进行自行改正以上表格。 最后编写程序进行词法剖析,判断目标在哪个表中并进行显示。 三、实验结果 测试数据 数据共分为3组,分别以下: 第一组数据 vari,j,k:integer; begin i:=5; j:=6; k:=i+j; write("k=",k); End. 第二组数据 vari,sum:integer; begin sum:=0; fori:=1to10do begin sum:=sum+i; end; writeln("sum=",sum); End. 第三组数据 varweight,price:real; begin write("pleaseinputweight:"); readln(weight); ifweight<10 then price=5; else price=5+(weight-10)*; writeln("price=",price);

文档评论(0)

137****3851 + 关注
实名认证
内容提供者

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

认证主体尹**

1亿VIP精品文档

相关文档

相关课程推荐