词法分析程序

对一段字符串进行判断

输入:字符串,以#结束。

输出:关键字或字母或数字或符号+对应种别码

种别码对照

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
char sum[MAX],ch,token[MAX];//字符串储存,单个字符,字符提取
int a=0,zbm,n,i;//计数器,种别码
char *gjz[6]={"begin","if","then","while","do","end"};

void FX();

void main()
{
    printf("请输入字符串,以#结束:");
    do
    {
        ch=getchar();
        sum[a++]=ch;
    }while(ch!='#');
    a=0;
    do
    {
        FX();
        printf("%d\t%s\n",zbm,token);

    }while(zbm!=0);//直到最后一个为#
    getchar();
}

void FX()
{
    for(n=0;n<MAX;n++)
    {token[n]='\0';}
    n=0;
    ch=sum[a++];
    while(ch==' '){ch=sum[a++];}

    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//字母或字母+数字
    {
        do{
            token[n++]=ch;//复制到提取中
            ch=sum[a++];
        }while((ch>='a'&&ch<='z')||(ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'));
        zbm=11;

        for(n=0;n<6;n++)//关键字提取
        {
            if(strcmp(token,gjz[n])==0)
        {
            zbm=n+1;
        }
        }
        a--;

    }
    else if(ch>='0'&&ch<='9')//纯数字
    {
        a--;
        do
        {
            token[n++]=sum[a++];
            ch=sum[a];
        }while(ch>='0'&&ch<='9');
        zbm=11;
        return;
    }
    else
    {
        switch(ch)
        {
        case '+':zbm=13;token[0]=ch;break;
        case '-':zbm=14;token[0]=ch;break;
        case '*':zbm=15;token[0]=ch;break;
        case '/':zbm=16;token[0]=ch;break;
        case ':':zbm=17;token[0]=ch;ch=sum[a++];
            if(ch=='='){
            token[1]=ch;
            zbm++;
            }
            else a--;
            break;
        case '<':zbm=20;token[0]=ch;ch=sum[a++];
            if(ch=='='){
                        token[1]=ch;
                        zbm++;
            }
            else if(ch=='>'){
                             token[1]=ch;
                             zbm=zbm+2;
            }
            else a--;
            break;
        case '>':zbm=23;token[0]=ch;ch=sum[a++];
            if(ch=='='){
                        token[1]=ch;
                        zbm++;
            }
            else a--;
            break;
        case '=':zbm=25;token[0]=ch;break;
        case ';':zbm=26;token[0]=ch;break;
        case '(':zbm=27;token[0]=ch;break;
        case ')':zbm=28;token[0]=ch;break;
        case '#':zbm=0;token[0]=ch;break;
        default:break;
        }
    }
}

运行结果:

 

posted @ 2016-10-09 15:41  157-符致伟  阅读(119)  评论(2编辑  收藏  举报