编译原理实验题.docVIP

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

Pl/0语言文法的BNF表示: 〈程序〉→〈分程序. 〈分程序〉→ [常量说明部分][变量说明部分][过程说明部分]〈语句〉 常量说明部分 → const常量定义{ ,常量定义}; 常量定义 → 标识符=无符号整数 无符号整数 → 数字{数字} 变量说明部分 → var标识符{ ,标识符}; 标识符 → 字母{字母|数字} 过和说明部分 → 过程首部分程度;{过程说明部分} 过程首部 → procedure标识符; 语句 → 赋值语句|条件语句|当型循环语句|过程调用语句|读语句|写语句|复合语句|空 赋值语句 → 标识符:=表达式 复合语句 → begin语句{ ;语句}end 条件 → 表达式关系运算符表达式|ood表达式 表达式 → [+|-]项{加减运算符项} 项 → 因子{乘除运算符因子} 因子 → 标识符|无符号整数|(表达式) 加减运符 → +|- 乘除运算符 → *|/ 关系运算符 → =|#||=||= 条件语句 → if条件then语句 过程调用语句 → call标识符 当型循环语句 → while条件do语句 读语句 → read(标识符{ ,标识符}) 写语句 → write(标识符{,标识符}) 字母 → a|b|c…x|y|z 数字 → 0|1|2…7|8|9 为PL/0语言建立一个词法分程序GETSYM(函数) 把关键字、算符、界符称为语言固有的单词,标识符、常量称为用户自定义的单词。为此设置三个全程量:SYM,ID,NUM 。 SYM:存放每个单词的类别,为内部编码的表示形式。 ID:存放用户所定义的标识符的值,即标识符字符串的机内表示。 NUM:存放用户定义的数。 GETSYM要完成的任务: 滤掉单词间的空格。 识别关键字,用查关键字表的方法识别。当单词是关键字时,将对应的类别放在SYM中。如IF的类别为IFSYM,THEN的类别为THENSYM。 识别标识符,标识符的类别为IDENT,IDRNT放在SYM中,标识符本身的值放在ID中。关键字或标识符的最大长度是10。 拼数,将数的类别NUMBER放在SYM中,数本身的值放在NUM中。 拼由两个字符组成的运算符,如:=、=等等,识别后将类别存放在SYM中。 打印源程序,边读入字符边打印。 由于一个单词是由一个或多个字符组成的,所以在词法分析程序GETSYM中定义一个读字符过程GETCH。 为PL/0语言建立一个语法分析程序BLOCK(函数) PL/0编译程序采用一遍扫描的方法,所以语法分析和代码生成都有在BLOCK中完成。BLOCK的工作分为两步: 说明部分的处理 说明部分的处理任务就是对每个过程(包括主程序,可以看成是一个主过程)的说明对象造名字表。填写所在层次(主程序是0层,在主程序中定义的过程是1层,随着嵌套的深度增加而层次数增大。PL/0最多允许3层),标识符的属性和分配的相对地址等。标识符的属性不同则填写的信息不同。 所造的表放在全程量一维数组TABLE中,TX为指针,数组元素为结构体类型数据。LEV给出层次,DX给出每层的局部量的相对地址,每说明完一个变量后DX加1。 例如:一个过程的说明部分为: const a=35,b=49; var c,d,e; procedure p; var g; 对它的常量、变量和过程说明处理后,TABLE表中的信息如下: NAME: a NAME: b NAME: c NAME: d NAME: e NAME: p KIND: CONSTANT KIND: CONSTANT KIND: VARIABLE KIND: VARIABLE KIND: VAEIABLE KIND: PROCEDURE VAL: 35 VAL: 49 LEVEL: LEV LEVEL: LEV LEVEL: LEV LEVEL: LEV ADR: DX ADR: DX+1 ADR: DX+2 ADR: NAME: g 。 。 。 KIND: VARIABLE 。 。 。 LEVEL: LEV+1 。 。 。 ADR: DX 。 。 。 对于过程名的ADR域,是在过程体的目标代码生成后返填过程体的入口地址。 TABLE表的索引TX和层次单元LEV都是以BLOCK的参数形式出现,在主程序调用BLOCK时实参的值为0。每个过程的相对起始位置在BLOCK内置初值DX=3。 2.语句处理和代码生成 对语句逐句分析,语法正确则生目标代码,当遇到标识符的引用则去查TABLE表,看是否有过正确的定义,若有则从表中取出相关的信息,供代码生成用。PL/0语言的代码生成是由过程GEN完成。GEN过程有三

文档评论(0)

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

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

1亿VIP精品文档

相关文档