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后语句执行
                                             完的位置,它正是前面未定的跳转地址*/
                        }
                    }
  • 7
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值