您的位置:首页 > 其它

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

2016-05-19 17:11 676 查看
思路就是在检测小于号时检测一下如果后边为大于号就把当前的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编译原理 pl0