用c语言写的词法分析器,但是判断为纯数字模块时,好像写的与整体不恰当,
测试时 if(a<=b)a=a4+10;
#include<stdio.h>
#include<string.h>
void Alpha(char *pbuffer); //标识符判断函数
void otherprocess(char *other,int n); //判断边界符
void Keywords(char *token); //判断关键字
char token[20];
void scan(char *Kword) //词法分析函数
{
int i,j,m;
char *buffer; //缓冲指针
buffer=Kword;
m=0;
if(buffer){ //指针移动到最后一位时,停止判断
for(i=0; i<20; i++) //对缓冲数组初始化,为0
token[i]='\0';
if(isdigit(*buffer) && buffer!='\0') { //判断是否为数字
while(isdigit(buffer) && buffer!='\0') { //指针没有到末尾,判断是否为数字,如果为数字,输出2...
buffer++;
}
printf("(2,指向10在符号表的入口) \n");
//buffer++;
//scan(buffer);
}
else if(isalpha(*buffer)) { //判读是否为英文字母
m=0;
while(isalpha (*buffer) && buffer!='\0' ){
token[m++] = *buffer;
buffer++;
if(isdigit(*buffer)) //判断下一位是否为数字,如果是进入Keywords中,
Alpha(buffer); //判断是否为标识符。否则继续测试是否为标识符
}
token[m]='\0';
Keywords(token);
scan(buffer);
}
else if((isdigit(*buffer)==0) && (isalpha(*buffer)==0)) { //如果既不是字母也不是数字判断符号
m=0;
while((isdigit(*buffer)==0) && (isalpha(*buffer)==0) && buffer) {
token[m++]=*buffer;
buffer++;
}
token[m]='\0';
otherprocess(token,m);
scan(buffer);
}
else
scan(buffer);
}
}
//判断关键字
void Keywords(char *token)
{
if(strcmp(token,"if")==0) {
printf("( 3, - ) \n");
}
else if(strcmp(token,"else")==0) {
printf("4 , -) \n");
}
else if(strcmp(token,"while")==0) {
printf("(5 , - ) \n");
}
else if(strcmp(token,"for")==0) {
printf("(6 , - ) \n");
}
else{
printf("1,指向a在符号表的入口 \n");
}
}
//判断是否为标识符,如果是,输出“1,指向a在符号表的入口”
void Alpha(char *pbuffer){
// int m=0;
while(isalpha(*pbuffer)||isdigit(pbuffer)&&*pbuffer!='\0') { //判断是否为标识符
// token[m++]=*pbuffer;
pbuffer++;
}
//token[m++]='\0';
// pbuffer--;
printf("1,指向a在符号表的入口");
scan(pbuffer);
}
//判断为运算符或者为边界符
void otherprocess(char *other,int n)
{
int i;
for(i=0; i<n; i++) {
switch(other[i]){
case '(':
printf("( 55 , -) \n");
break;
case ')':
printf("( 56 , - ) \n");
break;
case ';':
printf("( 57 , -) \n");
break;
case '=':
if(other[i+1]=='='){
printf("( 38 , -) \n");
i+=1;
}
else
printf("( 37 , -) \n");
break;
case '<':
if(other[i+1]=='='){
printf("( 40 , -) \n");
i+=1;
}
else
printf("( 39 ,-) \n");
break;
case '+':
printf("(35 , -) \n");
break;
case '-':
printf("(36 , -) \n");
break;
}
}
}
{
char string1[]={"if(a<=b)a=a4+10;"};
char *cbuffer;
cbuffer=string1;
while(*cbuffer==' ' || *cbuffer=='#')
cbuffer++;
scan(cbuffer);
return 0;
}