编译原理词法分析程序

来源:互联网 发布:优化驱动器有危险吗 编辑:程序博客网 时间:2024/06/05 08:57
#include <iostream>#include<string>#include<stdio.h>#include<stdlib.h>#include<ctype.h>using namespace std;#define  MAX 22char 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;}

1 0
原创粉丝点击