首页 > 技术文章 > 词法分析(改)

blueYE00 2015-10-10 17:34 原文

#include<stdio.h>
#include<string.h>
int i,s=1;

//判断是否数字
void number(char a[])
{
    char b[100];
    int m,k=0,t;
    m=i;
    while(a[m]>='0' && a[m]<='9')  
    {
        b[k]=a[m];   //用数组b存放数组a中的数字
        k++;
        m++;
    }
    i=m-1;
    printf("(11,");
    for(t=0;t<k;t++)
        printf("%c",b[t]);
    printf(")\n");
}

//检索关键字表格
void keyword(char a[])
{
    int k=0,m,flag=0,t;
    char b[100];
    char *key[6]={"begin","if","then","while","do","end"};
    m=i;
    while((a[m]>='a'&&a[m]<='z')||(a[m]>='A'&&a[m]<='Z')) //用数组b存放数组a中的字母
    {
        b[k]=a[m];   
        k++;
        m++;
        b[k]='\0';
    }
    i=m-1;
    for(t=0;t<6;t++)
    {
        if(strcmp(b,key[t])==0)  //将数组b与关键字进行比较
        {
            printf("(%d,%s)\n",t+1,key[t]);  //输出关键字
            flag=1;
        }
    }
    if(flag==0)
    {
        printf("(10,%s)\n",b);   //输出标识符
    }
}

//词法扫描函数
void Fenxi(char ch,char b)
{  
     switch(ch)
     {
        case '=':
            printf("(25,=)\n");break;
        case '+':
            printf("(13,+)\n");break;
        case '-':
            printf("(14,-)\n");break;
        case '*':
            printf("(15,*)\n");break;
        case '/':
            printf("(16,/)\n");break;
        case'(':
            printf("(27,()\n");break;
        case')':
            printf("(28,))\n");break;
        case ',':
            printf("(32,,)\n");break;
        case ';':
            printf("(34,;)\n");break;
        case ':':
            if(b=='=')
            {
                i++;
                printf("(18,:=)\n");
            }
            else
                printf("(17,:)\n");
            break;
        case '<':
            if(b=='>')
            {
                i++;
                printf("(21,<>)\n");
            }
            else if(b=='=')
            {
                i++;
                printf("(22,<=)\n");
            }
            else
                printf("(20,<)\n");
            break;
        case '>':
            if(b=='=')
            {
                printf("(24,>=)\n");
                i++;
            }
            else
                printf("(23,>)\n");
            break;
        default:
            s=0;
            break;
    }
}

main()
{
    char p;
    char a[100];
    printf("请输入源程序(以#结束):\n");
    for(i=0;i<100;i++)
    {
        scanf("%c",&p);
        a[i]=p;
        if(p=='#')
            break;
    }
    printf("\n分析结果为:\n");
    i=0;
    while(i<100&&a[i]!='#')
    {
        if((a[i]>=65&&a[i]<=90)||(a[i]>=97&&a[i]<=122))   
            keyword(a);
        else if(a[i]>=48&&a[i]<=57)
            number(a);
        else
            Fenxi(a[i],a[i+1]);
        i++;
    }
    if(a[i]=='#')
        printf("(0,#)");
    printf("\n");
}

推荐阅读