词法分析程序

    这次的实验是编制一个词法分析程序,要求,输入:源程序的字符串,输出:二元组(种别,单词符号本身)。只要根据字符串的不同性质分组,代入到不同的种别码,然后可以输出了

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char sum[100],ch,token[100];
int a=0,zbm,n,i;
char *keyword[18]={"begin","and","const","long","float","double","void","main","if","else","then","break","int","char","include","for","while","printf"};
void scaner();


void main()
{
    printf("请输入一段你想测试的单词符号, 以‘#’号作为结束符号 !\n");
    do
    {
        ch=getchar();//输入字符
        sum[a++]=ch;//把字符存到数组里
    }while(ch!='#');//以#为循环条件
    a=0;
    
    do
    {
        scaner();
        printf("<%d,%s>\n",zbm,token);
      
    }while(zbm!=0);

    printf("感谢使用该系统\n");
    
    getchar();
    
}
void scaner()
{
    
    
    for(n=0;n<100;n++)
    {token[n]='\0';}
    n=0;
    ch=sum[a++];//全局变量p=0
    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=21;
        
        for(n=0;n<18;n++)
        {
            if(strcmp(token,keyword[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=22;
        
        
        return;
    }
    else
    {
        
    
        switch(ch)
        {
        case '+':zbm=24;token[0]=ch;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;
            ch=sum[a++];
            if(ch=='='){token[1]=ch;zbm++;}
            else a--;
            break;
        case '<':zbm=30;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=33;token[0]=ch;
            ch=sum[a++];
            if(ch=='='){token[1]=ch;zbm++;}
            else a--;
            break;
        case '=':zbm=35;token[0]=ch;break;
        case ';':zbm=36;token[0]=ch;break;
        case '(':zbm=37;token[0]=ch;break;
        case ')':zbm=38;token[0]=ch;break;
        case '{':zbm=39;token[0]=ch;break;
        case '}':zbm=40;token[0]=ch;break;
        case '!':zbm=41;token[0]=ch;break;
        case '@':zbm=42;token[0]=ch;break;
        case '$':zbm=43;token[0]=ch;break;
        case '%':zbm=44;token[0]=ch;break;
        case '^':zbm=45;token[0]=ch;break;
        case '&':zbm=46;token[0]=ch;break;
        case '#':zbm=0;token[0]=ch;break;
            
        default: printf("词法分析出错! 请检查是否输入非法字符\n");zbm=-1;break;
            
        }
        

    }
    
}

 

以下为源代码编译结果

 

以下为我编写的种别码

 

posted @ 2016-10-01 20:11  150颜杰文  阅读(157)  评论(0编辑  收藏  举报