扩充条件语句,格式为:<条件语句>::= IF <条件>THEN <语句>[ELSE <语句>]
# define norw 14 /*关键字个数*/
2 . 在枚举集合中添加else标识
/*符号*/
enum symbol{
nul, ident, number, plus, minus,
times, slash, oddsym, eql, neq,
lss, leq, gtr, geq, lparen,
rparen, comma, semicolon,period, becomes,
beginsym, endsym, ifsym, thensym, whilesym,
writesym, readsym, dosym, callsym, constsym,
varsym, procsym, elsesym,
};
3 . 修改保留字个数
#define symnum 33
PL0.c
4. 设置保留字名字
因为编译器中查找关键字使用折半查找,限制条件是查找数据必须有序,这里按照首字母字母表顺序
strcpy(&(word[4][0]),"else");//添加else关键字,为了满足折半查找条件,数据需要有序
5 .设置保留字符号
wsym[4]=elsesym;//添加else关键字
6 . 在statement语句处理(语法分析)函数中添加else语义处理
if(sym==ifsym) /*准备按照if语句处理*/
{
getsymdo;
memcpy(nxtlev,fsys,sizeof(bool)*symnum);
nxtlev[thensym]=true;
nxtlev[dosym]=true; /*后跟符号为then或do*/
conditiondo(nxtlev,ptx,lev); /*调用条件处理(逻辑运算)函数*/
if(sym==thensym)
{
getsymdo;
}
else
{
error(16); /*缺少then*/
}
cx1=cx; /*保存当前指令地址*/
gendo(jpc,0,0); /*生成条件跳转指令,跳转地址暂写0*/
statementdo(fsys,ptx,lev); /*处理then后的语句*/
//添加处理else语句
if(sym == elsesym){
getsymdo;
cx2=cx;
gendo(jmp,0,0);
code[cx1].a=cx;
statementdo(fsys,ptx,lev);
code[cx2].a=cx;
}else{
//以上是处理else语句
code[cx1].a = cx; /*经statement处理后,cx为then后语句执行
完的位置,它正是前面未定的跳转地址*/
}
}