代码改变世界

词法分析

2016-09-30 17:34  AAAAAAABE  阅读(160)  评论(0编辑  收藏  举报

词法分析程序的功能:

输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

 

符号与种别码对照表:

用文法描述词法规则:

关键字,也称基本字,if, then, while, do等
标识符,表示各种名字,如变量名、数组名、函数名等,如char ch, int syn, token,sum
常数,如123,4587
运算符,如+, -, *, /, :=, <=, >, <>等
界符,,;():等

 

代码:

#include<stdio.h>                
#include<string.h>              
#include<conio.h>                 
#include<ctype.h>                  
char prog[80]={'\0'},
     token[8];                     
char ch;
int syn,                           
      n,
    sum,                          
    m,p;                           
char *rwtab[6]={"begin","if","then","while","do","end"};
void scaner()
{
    m=0;
    sum=0;
    for(n=0;n<8;n++)
        token[n]='\0';
    ch=prog[p++];
    while(ch==' ')
        ch=prog[p++];
    if(isalpha(ch))   
    {
        while(isalpha(ch)||isdigit(ch))    
        {
           token[m++]=ch;
           ch=prog[p++];}
        token[m++]='\0';
        ch=prog[p--];
        syn=10;
        for(n=0;n<6;n++)
            if(strcmp(token,rwtab[n])==0)    
            {
                syn=n+1;
                break;
            }
    }
    else
        if(isdigit(ch))   
        {
            while(isdigit(ch))   
            {
                sum=sum*10+ch-'0';
                ch=prog[p++];
            }
            ch=prog[p--];
            syn=11;}
        else
            switch(ch)
        {
                case'<':m=0;token[m++]=ch;ch=prog[p++];
                        if(ch=='>')
                        {
                            syn=21;
                            token[m++]=ch;}
                        else if(ch=='=')
                        {
                            syn=22;
                            token[m++]=ch;
                        }
                            else
                            {
                                 syn=20;
                                 ch=prog[p--];
                            }
                        break;
                case'>':m=0;token[m++]=ch;ch=prog[p++];
                        if(ch=='=')
                        {
                            syn=24;
                            token[m++]=ch;
                        }
                        else{
                            syn=23;
                            ch=prog[p--];
                        }
                        break;
             case':':m=0;token[m++]=ch;ch=prog[p++];
                     if(ch=='=')
                     {
                         syn=18;
                         token[m++]=ch;
                     }
                     else{
                         syn=17;
                         ch=prog[p--];
                     }
                     break;
             case'+':syn=13;token[0]=ch;break;
             case'-':syn=14;token[0]=ch;break;
             case'*':syn=15;token[0]=ch;break;
             case'/':syn=16;token[0]=ch;break;
             case'=':syn=25;token[0]=ch;break;
             case';':syn=26;token[0]=ch;break;
             case'(':syn=27;token[0]=ch;break;
             case')':syn=28;token[0]=ch;break;
             case'#':syn=0;token[0]=ch;break;
             default:syn=-1;
        }
}
main()
{

p=0;
    printf("请输入词法(以#结束):\n");
    do {
           ch=getchar();
           prog[p++]=ch;
       }while(ch!='#');
     
p=0;
    do{
        scaner();
        switch(syn)
        {
            case 11: printf("(%d,%d)\n",syn,sum);break;
            default: printf("(%d,%s)\n",syn,token);
        }
    }while(syn!=0);
}