寻求帮助,用c语言写的词法分析器,但是判断为纯数字模块时,好像写的与整体不恰当

小亭子 发布于 2013/05/14 17:29
阅读 283
收藏 2

用c语言写的词法分析器,但是判断为纯数字模块时,好像写的与整体不恰当,

测试时 if(a<=b)a=a4+10;

#include<stdio.h>
#include<string.h>

void scan(char *Kword);    //词法分析
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;
        }
    }
}

int main()
{
    char string1[]={"if(a<=b)a=a4+10;"};
    char *cbuffer;
    cbuffer=string1;
    while(*cbuffer==' ' || *cbuffer=='#')
        cbuffer++;
    scan(cbuffer);
    return 0;
}






加载中
0
jingweiyoung
jingweiyoung
不清楚你的问题, -_-||...
小亭子
小亭子
这么说把,如果测试:if(a<b)a=a+10;时,对 ; 没有做判断,不知道为什么,
返回顶部
顶部