最近在辅导学生编译原理,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