学习使用的PL/0编译器增强版PL/0plusplusCompiler(五)使用<>代替#不等于号

来源:互联网 发布:wince6.0导航软件 编辑:程序博客网 时间:2024/06/05 15:28

思路就是在检测小于号时检测一下如果后边为大于号就把当前的token组合识别为不等于号。

/*词法分析,获取一个符号*/int getsym(){    int i,j,k;    while( ch==' '||ch==10||ch==9)    {        getchdo;    }    if(ch>='a'&&ch<='z')    {         k=0;        do{            if(k<al)            {                 a[k]=ch;                k++;            }            getchdo;         }while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9');        a[k]=0;        strcpy(id,a);        i=0;        j=norw-1;        do{            k=(i+j)/2;            if(strcmp(id,word[k])<=0)            {                j=k-1;            }            if(strcmp(id,word[k])>=0)            {                i=k+1;            }        }while(i<=j);        if(i-1>j)        {            sym=wsym[k];        }        else        {            sym=ident;        }    }    else    {        if(ch>='0'&&ch<='9')        {            k=0;            num=0;            sym=number;            do{                num=10*num+ch-'0';                k++;                getchdo;            }while(ch>='0'&&ch<='9'); /*获取数字的值*/            k--;            if(k>nmax)            {                error(30);            }        }        else        {            if(ch==':')             /*检测赋值符号*/            {                getchdo;                if(ch=='=')                {                    sym=becomes;                    getchdo;                }                else                {                    sym=nul;            /*不能识别的符号*/                }            }            else            {                if(ch=='<')         /*检测小于或小于等于符号*/                {                    getchdo;                    if(ch=='=')                    {                        sym=leq;                        getchdo;                    }                    else                    {                        if(ch=='>'){    /*检测不等于号*/                            sym=neq;                            getchdo;                        }else{                            sym=lss;                            }                    }                }                else                {                    if(ch=='>')          /*检测大于或大于等于符号*/                    {                        getchdo;                        if(ch=='=')                                {                            sym=geq;                            getchdo;                        }                        else                        {                            sym=gtr;                        }                    }                    else                    {                                   sym=ssym[ch];/* 当符号不满足上述条件时,全部按照单字符号处理*/                                //getchdo;                                //richard                                if(sym!=period)                                {                                    getchdo;                                }                                //end richard                    }                }            }        }    }    return 0;}
0 0
原创粉丝点击