- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
 - 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
 - 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
 - 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
 - 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
 
                        查看更多
                        
                    
                Pl0语言文法的BNF表示.doc
                    Pl/0语言文法的BNF表示:
〈程序〉→〈分程序〉。
〈分程序〉→ [常量说明部分][变量说明部分][过程说明部分]〈语句〉
 常量说明部分 → CONST常量定义{ ,常量定义};
 常量定义 → 标识符=无符号整数
 无符号整数 → 数字{数字}
 变量说明部分 → VAR标识符{ ,标识符};
 标识符 → 字母{字母|数字}
 过和说明部分 → 过程首部分程度;{过程说明部分}
 过程首部 → procedure标识符;
 语句 → 赋值语句|条件语句|当型循环语句|过程调用语句|读语句|写语句|复合语句|空
 赋值语句 → 标识符:=表达式
 复合语句 → begin语句{ ;语句}end
 条件 → 表达式关系运算符表达式|odd表达式
 表达式 → [+|-]项{加减运算符项}
 项 → 因子{乘除运算符因子}
 因子 → 标识符|无符号整数|(表达式)
 加减运符 → +|-
 乘除运算符 → *|/
 关系运算符 → =|#||=||=
 条件语句 → 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表中的信息如下:
TX0 →
TX0 →
TX1 →
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)