课程设计要求
基本内容:
(1)扩充赋值运算:*= 和/=
(2)扩充语句(Pascal的FOR语句):
①FOR <变量>:=<表达式> TO <表达式> DO <语句>
②FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句>
其中,语句①的循环变量的步长为2,
语句②的循环变量的步长为-2。
在课内实验的基础上,额外增加*=和/=运算符和关键字的语义动作,以下是设计思路:
1. 扩充单词
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 *= ess!");
}
else sym=times;
}
else if(ch=='/'){ /* “/=”*/
getchdo;
if(ch=='='){sym=slasheql;
getchdo;
printf("check /= ess!");
}
else sym=slash;
}
/*其中printf部分均为识别成功后用作返回的信息而设*/
扩充赋值运算符:*=和/=,关键字For
EBNF范式的书写:
<变量>*=|/=<表达式>
<for 语句>::=for<变量>:=<表达式> to <表达式> do <语句>
<for 语句>::=for<变量>:=<表达式> downto <表达式> do <语句>
语法描述图:
a.*=和/=:
语句
Ident
:=
/=
*=
表达式
递归下降子程序
+=,/=;
es部分作为修改:
/e语句后的修改部分*/
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);
}
}
}
}
:
找到statement部分的calsym部分后作为增加:
/以下为连接callsym语句后的增加部分*/
else
if(sym==forsym)
{
getsymdo;
if(sym==ident)
{
i=position(id,*ptx);
if(i==0)
{
error(11);
}
else
{
if(table[i].kind!=variable) {
error(12);
i=0;
}
else
{
getsymdo;
if(sym==es)
{
getsymdo;
}
else
{
error(13);
}
memcpy(nxtl
编译原理pL0实验报告 来自淘豆网m.daumloan.com转载请标明出处.