关闭

基于C++的C语言词法分析器

748人阅读 评论(0) 收藏 举报
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
char ch =' ';
string key[12]={"int","continue","if","then","else","while","for","double",
"do","const","char","switch"};
bool Iskey(string c){         //关键字判断
   int i;
   for(i=0;i<12;i++) {
      if(key[i].compare(c)==0) return true;
       }
    return false;
}
bool IsLetter(char c) {        //判断是否为字母
    if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))
        return true;
    else
        return false;
}
bool IsDigit(char c){          //判断是否为数字
     if(c>='0'&&c<='9')
        return true;
     else
        return false;
}
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)) {
                             if((ch<='Z')&&(ch>='A')) ch=ch+32;
                             arr=arr+ch;
                             ch=fgetc(fpin);
                               }
                 fseek(fpin,-1L,SEEK_CUR);
                 if (Iskey(arr))
                    {cout<<arr<<"         关键字"<<endl;}
                 else
                     cout<<arr<<"         普通标识符"<<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<<"         无符号实数"<<endl;
             }
       else switch(ch){
               case'+':
               case'-' :
               case'*' :
               case'=' :
               case'/' :cout<<ch<<"         运算符"<<endl;break;
               case'(' :
               case')' :
               case'[' :
               case']' :
               case';' :
               case'.' :
               case',' :
               case'{' :
               case'}' :cout<<ch<<"         界符"<<endl;break;
               case':' :{ch=fgetc(fpin);
                        if(ch=='=') cout<<":="<<"         运算符"<<endl;
                        else {cout<<"="<<"         运算符"<<endl;;
                        fseek(fpin,-1L,SEEK_CUR);}
                        }break;
               case'>' :{ch=fgetc(fpin);
                         if(ch=='=') cout<<">="<<"         运算符"<<endl;
                         if(ch=='>')cout<<">>"<<"         输入控制符"<<endl;
                         else {cout<<">"<<"         运算符"<<endl;
                             fseek(fpin,-1L,SEEK_CUR);}
                         }break;
               case'<' :{ch=fgetc(fpin);
                         if(ch=='=')cout<<"<="<<"         运算符"<<endl;
                         else if(ch=='<')cout<<"<<"<<"         输出控制符"<<endl;
                         else if(ch=='>') cout<<"<>"<<"         运算符"<<endl;
                         else{cout<<"<"<<"         运算符"<<endl;
                            fseek(fpin,-1L,SEEK_CUR);}
                        }break;
              default : cout<<ch<<"         无法识别字符"<<endl;
        }
    }
}
int main(){

   char in[30];
   FILE * fpin;
   cout<<"请输入源文件名(包括路径和后缀名):";
   for(;;){
       cin>>in;
       if((fpin=fopen(in,"r"))!=NULL) break;
       else cout<<"文件路径错误!请输入源文件名(包括路径和后缀名):";
     }
   cout<<"\n********************分析如下*********************"<<endl;
   analyse(fpin);
   fclose(fpin);
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:55886次
    • 积分:1480
    • 等级:
    • 排名:千里之外
    • 原创:96篇
    • 转载:8篇
    • 译文:0篇
    • 评论:2条
    最新评论