词法分析

#include<stdio.h>

#include<string.h>
#include<ctype.h>
#define M 1000
struct key
{
    char g[20];
};
typedef struct key KEY;
int main()
{
    KEY k[6];
    int i=0,j=0;
    char a[M],b[M];
    strcpy(k[0].g,"begin");
    strcpy(k[1].g,"if");
    strcpy(k[2].g,"then");
    strcpy(k[3].g,"while");
    strcpy(k[4].g,"do");
    strcpy(k[5].g,"end");
 
    printf("请输入源程序:\n");
    gets(a);
    while(a[i]!='\0')
    {
        j=0;
        if((isalpha(a[i]))||(a[i]=='_'))
        {
            while((a[i]!=' ')&&(a[i]!='\0'))
            {
                if((isalpha(a[i]))||(isdigit(a[i])))
                {
                 b[j]=a[i];
                 j++;
                 i++;
                }
                else
                    break;
            }
            if((a[i]==' ')||(a[i]=='\0'))
            {
                b[j]='\0';
                if(strcmp(b,k[0].g)==0)
                    printf("begin\t种别码   1\n");
                else if(strcmp(b,k[1].g)==0)
                    printf("if   \t种别码   2\n");
                else if(strcmp(b,k[2].g)==0)
                    printf("then \t种别码   3\n");
                else if(strcmp(b,k[3].g)==0)
                    printf("while\t种别码   4\n");
                else if(strcmp(b,k[4].g)==0)
                    printf("do   \t种别码   5\n");
                else if(strcmp(b,k[5].g)==0)
                    printf("end  \t种别码   6\n");
                else
                    printf("%s  \t种别码   10\n",b);
            }
            else
            {
                b[j]='\0';
                printf("%s   \t种别码       10\n",b);
                i--;
            }
        }
 
        else if(isdigit(a[i]))
        {
            j=0;
            while(isdigit(a[i]))
            {
                 b[j]=a[i];
                 j++;
                 i++;
            }
            b[j]='\0';
            printf("%s    \t种别码    11\n",b);
            i--;
        }
        else
        {
            switch(a[i])
            {
            case '+':
                printf("%c   \t种别码   13\n",a[i]);break;
            case '-':
                printf("%c   \t种别码   14\n",a[i]);break;
            case '*':
                printf("%c   \t种别码   15\n",a[i]);break;
            case '/':
                printf("%c   \t种别码   16\n",a[i]);break;
            case ':':
                if(a[i+1]=='=')
                {   printf(":=   \t种别码   18\n");i++;break;}
                else
                {   printf("%c   \t种别码   17\n",a[i]);break;}
            case '<':
                if(a[i+1]=='=')
                {   printf("<=   \t种别码   21\n");i++;break;}
                if(a[i+1]=='>')
                {   printf("<>   \t种别码   22\n");i++;break;}
                else
                    printf("%c   \t种别码   20\n",a[i]);break;
            case '>':
                if(a[i+1]=='=')
                {   printf(">=   \t种别码   24\n");i++;break;}
                else
                    printf("%c   \t种别码   23\n",a[i]);break;
            case '=':
                printf("=    \t种别码    25\n");break;
            case ';':
                printf(";   \t种别码    26\n");break;
            case '(':
                printf("(   \t种别码   27\n");break;
            case ')':
                printf(")   \t种别码   28\n");break;
            case '#':
                printf("#   \t种别码   0\n");break;
            default:
                printf("%c   \t语法错误!\n",a[i]);break;
            }
        }
 
        i++;
    }
}
             
posted @ 2015-10-08 13:05  12冯婉莹  阅读(156)  评论(0编辑  收藏  举报