C++实现词法分析器(学习)

48 篇文章 2 订阅
28 篇文章 0 订阅

参考网上程序,我把生成的数据存在文件里,能分析C语言的源程序

#include<fstream>  
#include <iostream>  
#include <stdlib.h>  
#include <stdio.h>  
using namespace std;  
string KEYWORD[17]={"if","else","void","return","while","struct","for","do","int", //关键字  
                    "char","double","float","case","sizeof","break","swicth","default"};  
char SEPARATER[10]={';',',','{','}','[',']','(',')','"','#'};    //分隔符  
char OPERATOR[11]={'+','-','*','/','>','<','=','!','%',':','?'};     //运算符  
char FILTER[4]={' ','\t','\r','\n'};                    //过滤符  
const int IDENTIFIER=100;         //标识符值  
const int CONSTANT=101;           //常数值  
const int FILTER_VALUE=102;       //过滤字符值  


/**判断是否为关键字**/  
bool IsKeyword(string word){  
    for(int i=0;i<17;i++){  
        if(KEYWORD[i]==word){  
            return true;  
        }  
    }  
    return false;  
}  
/**判断是否为分隔符**/  
bool IsSeparater(char ch){  
    for(int i=0;i<10;i++){  
        if(SEPARATER[i]==ch){  
            return true;  
        }  
    }  
    return false;  
}  

/**判断是否为运算符**/  
bool IsOperator(char ch){  
    for(int i=0;i<11;i++){  
        if(OPERATOR[i]==ch){  
            return true;  
        }  
    }  
    return false;  
}  
/**判断是否为过滤符**/  
bool IsFilter(char ch){  
    for(int i=0;i<4;i++){  
        if(FILTER[i]==ch){  
            return true;  
        }  
    }  
    return false;  
}  
/**判断是否为大写字母**/  
bool IsUpLetter(char ch){  
    if(ch>='A' && ch<='Z') return true;  
    return false;  
}  
/**判断是否为小写字母**/  
bool IsLowLetter(char ch){  
    if(ch>='a' && ch<='z') return true;  
    return false;  
}  
/**判断是否为数字**/  
bool IsDigit(char ch){  
    if(ch>='0' && ch<='9') return true;  
    return false;  
}  
/**返回每个字的值**/  
template <class T>  
int value(T *a,int n,T str){  
    for(int i=0;i<n;i++){  
        if(a[i]==str) return i+1;  
    }  
    return -1;  
}  
/**词法分析**/  
void analyse(FILE * fpin){  
    ofstream fout("out.txt");
    char ch=' ';  
    string arr="";  
    while((ch=fgetc(fpin))!=EOF)
    {  
        arr="";  
        if(IsFilter(ch))   {}              //判断是否为过滤符  
        else if(IsLowLetter(ch))
        {       //判断是否为关键字  
            while(IsLowLetter(ch))
            {  
                arr += ch;  
                ch=fgetc(fpin);  
            }  
            //fseek(fpin,-1L,SEEK_CUR);  
            if(IsKeyword(arr))
            {  
                printf("%3d    ",value(KEYWORD,17,arr));  
                cout<<arr<<"  关键字"<<endl;  
                fout<<"<"<<value(KEYWORD,17,arr)<<" "<<arr<<"   "<<"关键字>\n";
            }  
            else  
            {  
                printf("%3d    ",IDENTIFIER);  
                cout<<arr<<"  标识符"<<endl;  
                fout<<"<"<<IDENTIFIER<<"    "<<arr<<"   "<<"标识符>\n";
            }  
        }  
        else if(IsDigit(ch))
        {           //判断是否为数字  
            while(IsDigit(ch)||(ch=='.'&&IsDigit(fgetc(fpin))))
            {  
                arr += ch;  
                ch=fgetc(fpin);  
            }  
            fseek(fpin,-1L,SEEK_CUR);  
            printf("%3d    ",CONSTANT);  
            cout<<arr<<"  整形数"<<endl; 
            fout<<"<"<<CONSTANT<<"  "<<arr<<"   "<<"整形数>\n"; 
        }  
        else if(IsUpLetter(ch)||IsLowLetter(ch)||ch=='_')
        {  
            while(IsUpLetter(ch)||IsLowLetter(ch)||ch=='_'||IsDigit(ch))
            {  
                arr += ch;  
                ch=fgetc(fpin);  
            }  
            fseek(fpin,-1L,SEEK_CUR);  
            printf("%3d    ",CONSTANT);  
            cout<<arr<<"  标识符"<<endl;  
            fout<<"<"<<CONSTANT<<"  "<<arr<<"   "<<"标识符>\n"; 
        }  
        else switch(ch)
        {  
        case '+':  
        case '-':  
        case '*':  
        case '/':  
        case '>':  
        case '<':  
        case '=':  
        case '!':  
        case ':':  
        case '?':  
        case '%':  
            {  
                arr += ch;  
                printf("%3d    ",value(OPERATOR,11,*arr.data()));  
                cout<<arr<<"  运算符"<<endl;  
                fout<<"<"<<value(OPERATOR,11,*arr.data())<<"    "<<arr<<"   "<<"运算符>\n"; 
                break;  
            }  
        case ';':  
        case ',':  
        case '(':  
        case ')':  
        case '[':  
        case ']':  
        case '{':  
        case '}':  
        case '"':  
        case '#':  
            {  
              arr += ch;  
              printf("%3d    ",value(SEPARATER,10,*arr.data()));  
              cout<<arr<<"  分隔符"<<endl;  
             fout<<"<"<<value(SEPARATER,10,*arr.data())<<"  "<<arr<<"   "<<"分隔符>\n"; 
              break;  
            }  
        default :
        {
             arr += ch;  
        cout<<"\""<<arr<<"\":无法识别的字符!\n"<<endl; 
        fout<<"<无法识别的字符!>\n"; 
        } 
        }  

    }  
  fout.close();
}  
int main()  
{  
    char inFile[40];  
    FILE *fpin;  
    cout<<"请输入源文件名(包括路径和后缀):";  
    while(true){  
        cin>>inFile;  
        if((fpin=fopen(inFile,"r"))!=NULL)  
            break;  
        else{  
            cout<<"文件名错误!"<<endl;  
            cout<<"请输入源文件名(包括路径和后缀):";  
        }  

    }  
    cout<<"------词法分析如下------"<<endl;  
    analyse(fpin);  
    return 0;  
}  
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值