詞法分析(修改版)

你若精彩,蝴蝶自來發表於2015-10-10
#include<stdio.h>
#include<string.h>
void Fenxi(char c,char b);
void word(char a[]);
void number(char a[]);
int i;  //定義全域性變數i
int s=1; //用來記錄是否存在非法字元
main(){
    char a[50];
    printf("請輸入源程式:");
    gets(a);
    printf("您要分析的源程式為:");
    printf("%s",a);
    printf("\n");
    for(i=0;(a[i]!='\0')&&(i<50)&&s==1;i++)
    {
        if((a[i]>='a' && a[i]<='z')||(a[i]>='A' && a[i]<='Z'))
            word(a);
        else if(a[i]>='0' && a[i]<='9')
            number(a);
        else
            Fenxi(a[i],a[i+1]);
    }
    printf("\n");
}

void number(char a[])  //對數字字元進行掃描分析
{
    char b[50];
    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(")");
    printf("\n");
}

void word(char a[])   //對字母字元進行掃描分析,並識別保留字
{
    int k=0,m,flag=0,t;
    char b[50];
    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)",t+1,key[t]);  //輸出關鍵字
            flag=1;
            printf("\n");
        }
    }
    if(flag==0)
    {
        printf("(10,%s)",b);   //輸出識別符號
        printf("\n");
    }
}
void Fenxi(char c,char b)  //對特殊字元進行掃描分析
{
    switch(c){
        case ' ':
            break;
        case '+':
            printf("(13,+)\n");
            break;
        case '-':
            printf("(14,-)\n");
            break;
        case '*':
            printf("(15,*)\n");
            break;
        case '/':
            printf("(16,/)\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;
        case '=':
            printf("(25,=)\n");
            break;
        case ';':
            printf("(26,;)\n");
            break;
        case '(':
            printf("(27,()\n");
            break;
        case ')':
            printf("(28,))\n");
            break;
        case '#':
            printf("(0,#)\n");
            break;
        default:
            {
            printf("\n存在字元 '%c',無法繼續識別!\n",c);
            s=0;    //用s=0記錄存在非法字元
            break;
            }
    }
}

相關文章