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

11人阅读 评论(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;  
}  
查看评论

C++实现词法分析器

  • 2010年05月17日 17:36
  • 1.86MB
  • 下载

自制编译器---c++实现词法分析器

词法单元词法解析器在编译器中的作用,是将输入流解析为一种能够被语法解析器使用和管理的格式。他将输入文本分割,打标签,也就是用一些数值来指代一系列相应的字符串。 例如:int a,b,c; a=34;...
  • taoyanqi8932
  • taoyanqi8932
  • 2016-06-25 21:45:07
  • 2533

编译原理——Tiny词法分析器c++实现

Tiny语言和c-相比更为简单,在实现的时候,对文本的读取,发现回车换行是一个头疼的问题,fgetc()函数和fseek()函数并不是一一对应的。fseek()会回车换行算两个字符,而fgetc()读...
  • hiluo302
  • hiluo302
  • 2016-04-28 14:01:04
  • 1905

词法分析器C++

  • 2013年03月30日 23:25
  • 16KB
  • 下载

编译原理c++简单词法分析器

简单词法分析程序         编译原理课程词法分析程序,自己c++写的比较简单功能实现,需要的用户可以在此基础上进行自己思路的扩充修改。功能:读取一个自己设定路径下的txt文件中代码,然后将分析...
  • ye_se_cong_cong
  • ye_se_cong_cong
  • 2017-05-31 21:09:35
  • 2935

编译原理--C-Minus词法分析器C++实现

词法分析器的主要功能是把源代码整理成一个个记号(token),记号的类型主要有系统保留字(if,return等)、特殊字符(+,*,/等)、字符串记号(数字和标志符)。 如:str[i] = 45 ...
  • hiluo302
  • hiluo302
  • 2016-04-25 14:57:24
  • 3657

c++实现词法分析器

  • 2018年03月24日 10:42
  • 11KB
  • 下载

C++词法分析器(C和C++实现)

  • 2009年11月09日 15:18
  • 14KB
  • 下载

c++词法分析器的实现(编译原理实验)

词法分析
  • moon_sui
  • moon_sui
  • 2017-04-26 17:02:23
  • 1338

C++实现编译原理的词法分析器

/** 程序名称:编译原理之词法分析器* 输    入:Test.c C语言源程序文件* 输    出:Const.txt 常量表 Sign.txt 标识符表 Result.txt 二元式结果* 编译...
  • jckimi
  • jckimi
  • 2010-03-21 22:07:00
  • 1482
    个人资料
    持之以恒
    等级:
    访问量: 4万+
    积分: 1286
    排名: 3万+
    最新评论