《编译原理》
专项选修课程实验报告
学院计算机学院
专业网络工程
年级班别2013级3班
学号
学生姓名
辅导教师刘添添
成绩
2015年12月
实验一
一.完成内容
扩充单词:
(1)将保留字if改为fi (2)增加保留字else (3)增加运算符++、+= 二.设计思路
(1)将保留字if改为fi
1)修改变量定义
2)修改GetSym()方法
(2)增加保留字else
1)修改变量定义
头文件
2)修改GetSym()方法
(3)增加运算符++、+=
1)修改变量定义
2)修改GetSym()方法
三.调试
1、添加else保留字时出错,原因是忽略了查找时是用折半查找的解决方法:按字母表顺序修改定义变量。
四.运行测试
(1)将保留字if改为fi
var a,b;
begin
a:=1;
b:=2;
fi b>a
then write(a)
end.
(2)增加保留字else
(3)增加运算符++、+=
实验二
一.完成内容 扩充else 子句 二.设计思路
(1)EBNF 范式以及语法描述图 语句
(1) 递归下降子程序
if(sym==ifsym) { getsymdo; memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlev[thensym]=true; nxtlev[dosym]=true; conditiondo(nxtlev,ptx,lev); /*调用条件处理(逻辑运算)函数*/ if(sym==thensym) { getsymdo; } else { error(16); /*缺少then*/ }
//~~~~~~从这里开始修改~~~~~~~~~~~~~~~ cx1=cx; gendo(jpc,0,0); memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlev[elsesym]=true; statementdo(nxtlev,ptx,lev); code[cx1].a=cx; if ( sym==elsesym ) { cx2=cx; getsymdo;
if
条件 then 语句
else
语句
gendo(jmp,0,0);
code[cx1].a=cx;
statementdo(fsys,ptx,lev);
code[cx2].a=cx;}
else {error(16);}
三.调试
1、运行出错原因:PL0代码错误
解决办法:查看出错提示,修改PL0代码
2、结果出错,原因:没有按条件转移
解决方法:查看递归下降子程序,对照PL0代码,尝试不同位置条件转移(非条件转移),查看结果,再慢慢修改。
四.运行测试
(1)
实验三
一.完成内容
扩充else子句
二.设计思路
(1)举例设计语句的pcode代码
1 int 0 5 11 lod 0 4
2 lit 0 6 12 lit 0 2
3 sto 0 3 13 sto 0 3
4 lit 0
5 14 jmp 0 0
5 sto 0 4 15 lod 0 4
6 lod 0 3 16 sto 0 3
7 lod 0 4 17 lod 0 3
8 opr 0 12 18 opr 0 14
9 jpc 0 11 19 opr 0 15
10 jmp 0
(2)在递归下降子程序中增加语义动作
if(sym==ifsym) /*准备按照if语句处理*/
{
getsymdo;
memcpy(nxtlev,fsys,sizeof(bool)*symnum);
nxtlev[thensym]=true;
nxtlev[dosym]=true; /*后跟符号为then或do*/
conditiondo(nxtlev,ptx,lev); /*调用条件处理(逻辑运算)函数*/
gendo(jpc,0,cx+2);
cx1=cx;
gendo(jmp,0,0);
if(sym==thensym)
{ getsymdo;}
else
{
error(16) }
//~~~~~~从这里开始修改~~~~~~~~~~~~~~~
cx2=cx;
gendo(jpc,0,0);
statementdo(nxtlev,ptx,lev);
code[cx2].a=cx;
if ( sym==elsesym )
{getsymdo; }
else
{error(16);} gendo(jmp,0,0);
code[cx1].a=cx;
statementdo(fsys,ptx,lev);
code[cx2].a=cx;
三.调试
1、结果出错或没有结果原因:条件(非条件)转移错误。
解决方法:查看pcode 代码,看哪一步的转移错误,分别尝试条件(非条件)转移,查看结果有何不同,再确定用哪一种转移
四.运行测试。