网站大量收购独家精品文档,联系QQ:2885784924

编译原理实习题.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理实习题

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,IDENT放在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完成。

文档评论(0)

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

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

1亿VIP精品文档

相关文档