编译原理程序设计实践(一) 项目描述
最近在辅导学生编译原理,题目是自己实现PL0语言的词法分析器、语法分析器、语义分析器、代码生成器和代码模拟器。本着以身作则的思想,自己先花了两周时间完成了以上工作。这里将各阶段的主要工作成果发出来,供后来者参考。
项目描述
一、PL0语法的范式
{}表示该成分可以出现0次到任意次, | 表示任选一种, []表示最多出现一次,即可有可无。
程序∷=分程序. 分程序∷=[常量说明部分] [变量说明部分] [过程说明部分] 语句 常量说明部分∷=CONST 常量定义 {,常量定义}; 常量定义∷=标识符=无符号整数 无符号整数∷=数字{数字} 变量说明部分∷=VAR 标识符{,标识符}; 标识符∷=字母{字母|数字} 过程说明部分∷=过程首部分程序 {;过程说明部分} ;过程首部∷= PROCEDURE 标识符 ; 语句∷= 赋值语句条件语句当型循环语句过程调用语句读语句写语句复合语句空语句 赋值语句∷= 标识符 := 表达式 复合语句∷=BEGIN 语句 {; 语句} END 条件∷= 表达式 关系运算符 表达式|ODD 表达式 表达式∷=[+|-] 项 {加法运算符 项} 项∷=因子{乘法运算符因子} 因子∷=标识符|无符号整数|'('表达式')' 加法运算符∷=+- 乘法运算符∷=*/ 关系运算符∷=# =<<=>>= 条件语句∷=IF 条件 THEN 语句 过程调用语句∷=CALL 标识符 当型循环语句∷=WHILE 条件 DO 语句 读语句∷=READ (标识符{,标识符} ) 写语句∷=WRITE (表达式{,表达式} )
此外,为了方便,规定%作为行注释符,从%开始到本行结束的所有字符均被忽略掉
二、测试文件的内容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、语法分析器要输出语法判断的结果,true或者false
3、语义分析检查各符号的合法性,true或者false
4、代码生成器要生成仿汇编代码。
5、模拟器对生成的v汇编代码进行运行。