TY=0; //变量类码为0
for(i=1;i<=NAMEL.last;i++)
if(NAMEL.data[i]==ch)break;//已有该变量,i记住其位置
if(i>NAMEL.last){NAMEL.data[i]=ch;NAMEL.last++;}//变量加入
case‘0’: case‘1’: case‘2’: case‘3’: case‘4’: case‘5’://处理常量
case‘6’: case ‘7’:case‘8’: case‘9’: TY=1;//常量类码为1 for(i=1;i<=CONSL.last;i++)
if(CONSL.data[i]==ch)break;////已有该常量,i记住其位
置
if(i>CONSL.last){CONSL.data[i]=ch;CONSL.last++;}//将新常量加入
default: //处理运算符
TY=operator(ch);//类码序号
i=’\\0’; //填入TOKEN的addr域(期望输出空白) }//结束switch,下面将ch填入TOKEN表
TOKEN.data[++TOKEN.last].typ=TY;TOKEN.data[TOKEN.last].addr=i; scanf(“%c”,&ch); //读入表达式的下一符号。 }//while }//算法结束
[程序讨论]为便于讨论,各一维数组下标均以1开始,在字符为变量或常量的情况下,将其类码用TY记下,用i记下其NAMEL表或CONSL表中的位置,以便在填TOKEN表时用。在运算符(‘+’,‘*’,‘(’,‘)’)填入TOKEN表时,TOKEN表的addr域没意义,为了程序统一,这里填入了’\\0’。本题是表达式处理的简化情况(只有3个单字母变量,常量只有0..9,操作符只4个),若是真实情况,所用数据结构要相应变化。