编译原理词法分析程序

#include <iostream>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
using namespace std;
#define  MAX 22
char ch =' ';
string key[15]={"switch","break","if","then","else","while","write","read",
"do", "int","const","char","float","double","for"};

int Iskey(string c)    //关键字判断
{
   int i;
   for(i=0;i<MAX;i++)
    {
      if(key[i].compare(c)==true)
        return 1;
    }
    return 0;
}
int IsLetter(char c)   //判断是否为字母
{
    if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))
        return 1;
    else
        return 0;
}
int IsDigit(char c)    //判断是否为数字
{
     if(c>='0'&&c<='9')
        return 1;
     else
        return 0;
}
void analyse(FILE *fpin)  //词法分析程序
{
    string arr="";
    while((ch=fgetc(fpin))!=EOF)
    {
        arr="";
        if(ch==' '||ch=='\t'||ch=='\n')
        {
        }
        else if(IsLetter(ch))
        {
            while(IsLetter(ch)||IsDigit(ch))
            {
                if((ch<='Z')&&(ch>='A'))
                    ch=ch+32;
                arr=arr+ch;
                ch=fgetc(fpin);
            }
            fseek(fpin,-1L,SEEK_CUR);
            if (Iskey(arr))
            {
                cout<<arr<<"\t$关键字"<<endl;
            }
            else  cout<<arr<<"\t$普通标识符"<<endl;
        }

        else if(IsDigit(ch))
        {
            while(IsDigit(ch)||(ch=='.'&&IsDigit(fgetc(fpin))))
            {
                arr=arr+ch;
                ch=fgetc(fpin);
            }
            fseek(fpin,-1L,SEEK_CUR);
            cout<<arr<<"\t$无符号实数"<<endl;
        }
       else switch(ch)
        {
           case'+':
           case'-' :
           case'*' :
           case'=' :
           case'/' :cout<<ch<<"\t$运算符"<<endl;break;
           case'(' :
           case')' :
           case'[' :
           case']' :
           case';' :
           case'.' :
           case',' :
           case'{' :
           case'}' :cout<<ch<<"\t$界符"<<endl;break;
           case':' :
            {ch=fgetc(fpin);
            if(ch=='=')
                cout<<":="<<"\t$运算符"<<endl;
            else
            {
                cout<<"="<<"\t$运算符"<<endl;;
                fseek(fpin,-1L,SEEK_CUR);
            }
            }break;
            case'>' :{ch=fgetc(fpin);
                         if(ch=='=') cout<<">="<<"\t$运算符"<<endl;
                         if(ch=='>')cout<<">>"<<"\t$输入控制符"<<endl;
                         else {cout<<">"<<"\t$运算符"<<endl;
                             fseek(fpin,-1L,SEEK_CUR);}
                         }break;
            case'<' :{ch=fgetc(fpin);
                         if(ch=='=')cout<<"<="<<"\t$运算符"<<endl;
                         else if(ch=='<')cout<<"<<"<<"\t$输出控制符"<<endl;
                         else if(ch=='>') cout<<"<>"<<"\t$运算符"<<endl;
                         else{cout<<"<"<<"\t$运算符"<<endl;
                            fseek(fpin,-1L,SEEK_CUR);}
                        }break;
            default : cout<<ch<<"\t$无法识别字符"<<endl;
        }
    }
}
int main()
{
   char in_fn[30];
   FILE * fpin;
   cout<<"请输入源文件名(包括路径和后缀名):";
   for(;;)
    {
       cin>>in_fn;
       if((fpin=fopen(in_fn,"r"))!=NULL)
            break;
       else
        cout<<"文件路径错误!请输入源文件名(包括路径和后缀名):";
    }
   cout<<"\n********************分析如下*********************"<<endl;
   analyse(fpin);
   fclose(fpin);

   return 0;
}

posted on 2014-06-12 09:21  lie隼  阅读(370)  评论(0编辑  收藏  举报