最近在辅导学生编译原理,x是实现PL0语言的词法分析器、语法分析器、语义分析器、代码生成器和代码模拟器。本着以身作则的思想,自己先花了两周时间完成了以上工作。这里将各阶段的主要工作成果发出来,供后来者参考。
相关参考资料
1、《编译原理》教材
作者:吕映芝 张素琴 蒋维杜
出版社:清华大学出版社
出版日期:1998年1月
2、PL/0语言编译程序分析
作者李凡希
地址:http://blog.csdn.net/lifanxi/article/details/3833
项目描述
一、PL0语言的语法描述(参考教材2.1.2节)
大括号{ }表示该成分可以出现0次到任意次, 竖线 | 从中表示任选一种, 中括号[ ]表示最多出现一次,即可有可无。
程序 ∷= 分程序. 分程序 ∷= [常量说明部分] [变量说明部分] [过程说明部分] 语句 常量说明部分 ∷= CONST 常量定义 {,常量定义}; 常量定义 ∷= 标识符=无符号整数 无符号整数 ∷= 数字{数字} 变量说明部分 ∷= VAR 标识符{,标识符}; 标识符 ∷= 字母{字母|数字} 过程说明部分 ∷= 过程首部分程序 {;过程说明部分} ; 过程首部 ∷= PROCEDURE 标识符 ; 语句 ∷= 赋值语句 | 条件语句 | 当型循环语句 | 过程调用语句 | 读语句 | 写语句 | 复合语句 | 空语句 赋值语句 ∷= 标识符 := 表达式 复合语句 ∷= BEGIN 语句 {; 语句} END 条件 ∷= 表达式 关系运算符 表达式 | ODD 表达式 表达式 ∷= [+|-] 项 {加法运算符 项} 项 ∷= 因子{乘法运算符因子} 因子 ∷= 标识符|无符号整数|'('表达式')' 加法运算符 ∷= +|- 乘法运算符 ∷= *|/ 关系运算符 ∷= # | = | < | <= | > | >= 条件语句 ∷= IF 条件 THEN 语句 过程调用语句 ∷= CALL 标识符 当型循环语句 ∷= WHILE 条件 DO 语句 读语句 ∷= READ (标识符{,标识符} ) 写语句 ∷= WRITE (表达式{,表达式} )
此外,为了方便,规定%作为行注释符,从%开始到行尾的所有字符均被忽略掉。
二、测试数据样例
以下代码是一个合法的PL0代码(教材P20)
const a=10; var b,c; procedure p; begin c:= b+a end ; begin read(b); while b#0 do begin call p ;write(2*c); read(b) end end .
三、实际输出
1、指令表
2 int 0 3 3 lod 1 3 4 lit 0 10 5 opr 0 2 6 sto 1 4 7 opr 0 0 8 int 0 5 9 opr 0 16 10 sto 0 3 11 lod 0 3 12 lit 0 0 13 opr 0 9 14 jpc 0 24 15 cal 0 2 16 lit 0 2 17 lod 0 4 18 opr 0 4 19 opr 0 14 20 opr 0 15 21 opr 0 16 22 sto 0 3 23 jmp 0 11 24 opr 0 0
2、模拟器运行效果
start pl0 ?2 24 ?4 28 ?0