- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理pL0实验报告
课程设计要求
基本内容:
(1)扩充赋值运算:*= 和 /=
(2)扩充语句(Pascal的FOR语句):
①FOR 变量:=表达式 TO 表达式 DO 语句
②FOR 变量:=表达式 DOWNTO 表达式 DO 语句
其中,语句①的循环变量的步长为2,
语句②的循环变量的步长为-2。
二.设计思路
在课内实验的基础上,额外增加*=和/=运算符和关键字的语义动作,以下是设计思路:
1. 扩充单词
在头文件pl0.h中的enum symbol中增加关键字forsym, tosym, downtosym, timeseqlsym, slasheqlsym,并修改关键字数#define symnum 46。
/*初始化*/
// ssym[*=]=timeseql;
// ssym[/=]=slasheql;
/*设置保留字名字,按照字母顺序,便于折半查找*/
strcpy((word[14][0]),to); /*增加后需要按序排列*/
strcpy((word[7][0]),for);
strcpy((word[4][0]),downto);
strcpy((word[3][0]),do);
/*设置保留字符号*/
wsym[7]=forsym;
wsym[14]=tosym;
/*语法分析,获取一个符号*/
在getsym()部分添加:
else if(ch==*){ /** “*=” **/
getchdo;
if(ch===){
sym=timeseql;
getchdo;
printf(check *= success!);
}
else sym=times;
}
else if(ch==/){ /* “/=” */
getchdo;
if(ch===){sym=slasheql;
getchdo;
printf(check /= success!);
}
else sym=slash;
}
/*其中printf部分均为识别成功后用作返回的信息而设*/
扩充赋值运算符:*=和/=,关键字For
EBNF范式的书写:变量*=|/=表达式for 语句::=for变量:=表达式 to 表达式 do 语句for 语句::=for变量:=表达式 downto 表达式 do 语句
语法描述图:a.*=和/=:
递归下降子程序a.增加+=,/=;找到statement部分的becomes部分作为修改:/以下为连接become语句后的修改部分*/
else if(sym==timeseql)
{
getsymdo;
memcpy(nxtlev,fsys,sizeof(bool)* symnum);
expressiondo(nxtlev,ptx,lev);
gendo(lod,lev-table[i].level,table[i].adr);
gendo(opr,0,4);
gendo(sto,lev-table[i].level,table[i].adr);
}
else if(sym==slasheql)
{
getsymdo;
memcpy(nxtlev,fsys,sizeof(bool)* symnum);
gendo(lod,lev-table[i].level,table[i].adr);
expressiondo(nxtlev,ptx,lev);
gendo(opr,0,5);
gendo(sto,lev-table[i].level,table[i].adr);
}
}
}
}
b.增加for: 找到statement部分的calsym部分后作为增加:/以下为连接callsym语句后的增加部分*/
else
if(sym==forsym)
{
getsymdo;
if(sym==ident)
{
i=pos
文档评论(0)