PL/0编译器---扩充IF-THEN-ELSE条件语句;

扩充条件语句,格式为:<条件语句>::= IF <条件>THEN <语句>[ELSE <语句>]

  1. 修改关键字个数
# 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后语句执行
                                             完的位置,它正是前面未定的跳转地址*/
                        }
                    }

你可能感兴趣的:(pl-0)