C++实现编译原理的词法分析器
2010-03-21 22:07
776 查看
/*
* 程序名称:编译原理之词法分析器
* 输 入:Test.c C语言源程序文件
* 输 出:Const.txt 常量表 Sign.txt 标识符表 Result.txt 二元式结果
* 编译环境:VC6.0_CN
* 操作系统:WinXP_SP2
* 程序版本:V1.0
* 备 注:此程序采用一缓冲方式读入程序源码,首先进行预处理去掉注释和无效空格
* 然后再进行详细的词法分析,为了便于后续处理,程序设置了几个表:符号
* 表和常数表。
* 注 意:此分析器对C语言子集进行处理
*/
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#define KEYWORD_LEN 32 //保留字个数
#define STR_MAX_LEN 300 //标识符最大长度
#define PRO_MAX_LEN 20480 //源程序最大长度
#define STB_MAX_LEN 1000 //符号表最大容量
#define CTB_MAX_LEN 1000 //常数表最大容量
#define ERROR 0 //错误
#define ID (KEYWORD_LEN+1) //标识符
#define CONST (KEYWORD_LEN+2) //常量
#define OPERAT (KEYWORD_LEN+3) //运算符
#define DIVIDE (KEYWORD_LEN+4) //界符
int errorLine=0;
char proBuffer[PRO_MAX_LEN] = ""; //存储程序代码的全局缓冲区
char ch; //读出来的当前字符
char wordget[STR_MAX_LEN]; //标识符 或 常量
int point = 0; //源程序当前位置指针
char signTab[STB_MAX_LEN][STR_MAX_LEN]; //符号表
int pointSTB = 0; //符号表指针
char constTab[CTB_MAX_LEN][STR_MAX_LEN]; //常量表
int pointCTB = 0; //常数表指针
char kwTab[KEYWORD_LEN][10]={ //保留字表 C语言一共有32个保留字[关键字]
"auto", "break", "case", "char", "const",
"continue", "default", "do", "double", "else",
"enum", "extern", "float", "for", "goto",
"if", "int", "long", "register", "return",
"short", "signed", "sizeof", "static", "struct",
"switch", "typedef", "union", "unsigned", "void",
"volatile", "while"};
char errorTab[][50]={ //错误代码表
/*0*/"未知错误", /*1*/"非法的字符", /*2*/"不正确的字符常量表达",
/*3*/"不正确的字符串表达", /*4*/"不正确的数字表达", /*5*/"注释丢失'*/'"};
typedef struct signDuality
{
int kind;
int value;
}*pDualistic, Dualistic;
//函数声明
void pretreatment(); //预处理
void ProcError(int id); //错误
bool GetChar(); //获得一个字符不包括结束标记
bool GetBC(); //获得一个非空白字符
void Concat(char *str); //将ch连接到str后
int Reserve(char *str); //对str字符串查找保留字表 若是一个保留字-返回其编码 否则返回0
void Retract(); //将搜索指示器回调一个字符位置
int InsertId(char *str);//将str串以标识符插入符号表,并返回符号表指针
int InsertConst(char *str); //将str串以常数插入符号表,并返回常数表指针
bool wordAnalyse(pDualistic pDu); //词法分析 true正常
//end
初步分析:pretreatement是预处理函数,读入文件,去掉注释,即自动检测“//”和“/*”,“*/”往后的字符
关键是如何去掉注释!
* 程序名称:编译原理之词法分析器
* 输 入:Test.c C语言源程序文件
* 输 出:Const.txt 常量表 Sign.txt 标识符表 Result.txt 二元式结果
* 编译环境:VC6.0_CN
* 操作系统:WinXP_SP2
* 程序版本:V1.0
* 备 注:此程序采用一缓冲方式读入程序源码,首先进行预处理去掉注释和无效空格
* 然后再进行详细的词法分析,为了便于后续处理,程序设置了几个表:符号
* 表和常数表。
* 注 意:此分析器对C语言子集进行处理
*/
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#define KEYWORD_LEN 32 //保留字个数
#define STR_MAX_LEN 300 //标识符最大长度
#define PRO_MAX_LEN 20480 //源程序最大长度
#define STB_MAX_LEN 1000 //符号表最大容量
#define CTB_MAX_LEN 1000 //常数表最大容量
#define ERROR 0 //错误
#define ID (KEYWORD_LEN+1) //标识符
#define CONST (KEYWORD_LEN+2) //常量
#define OPERAT (KEYWORD_LEN+3) //运算符
#define DIVIDE (KEYWORD_LEN+4) //界符
int errorLine=0;
char proBuffer[PRO_MAX_LEN] = ""; //存储程序代码的全局缓冲区
char ch; //读出来的当前字符
char wordget[STR_MAX_LEN]; //标识符 或 常量
int point = 0; //源程序当前位置指针
char signTab[STB_MAX_LEN][STR_MAX_LEN]; //符号表
int pointSTB = 0; //符号表指针
char constTab[CTB_MAX_LEN][STR_MAX_LEN]; //常量表
int pointCTB = 0; //常数表指针
char kwTab[KEYWORD_LEN][10]={ //保留字表 C语言一共有32个保留字[关键字]
"auto", "break", "case", "char", "const",
"continue", "default", "do", "double", "else",
"enum", "extern", "float", "for", "goto",
"if", "int", "long", "register", "return",
"short", "signed", "sizeof", "static", "struct",
"switch", "typedef", "union", "unsigned", "void",
"volatile", "while"};
char errorTab[][50]={ //错误代码表
/*0*/"未知错误", /*1*/"非法的字符", /*2*/"不正确的字符常量表达",
/*3*/"不正确的字符串表达", /*4*/"不正确的数字表达", /*5*/"注释丢失'*/'"};
typedef struct signDuality
{
int kind;
int value;
}*pDualistic, Dualistic;
//函数声明
void pretreatment(); //预处理
void ProcError(int id); //错误
bool GetChar(); //获得一个字符不包括结束标记
bool GetBC(); //获得一个非空白字符
void Concat(char *str); //将ch连接到str后
int Reserve(char *str); //对str字符串查找保留字表 若是一个保留字-返回其编码 否则返回0
void Retract(); //将搜索指示器回调一个字符位置
int InsertId(char *str);//将str串以标识符插入符号表,并返回符号表指针
int InsertConst(char *str); //将str串以常数插入符号表,并返回常数表指针
bool wordAnalyse(pDualistic pDu); //词法分析 true正常
//end
初步分析:pretreatement是预处理函数,读入文件,去掉注释,即自动检测“//”和“/*”,“*/”往后的字符
关键是如何去掉注释!
相关文章推荐
- 编译原理:第七节 及词法分析器的C++和Python实现
- C++函数编译原理和成员函数的实现
- 编译原理(六) LL(1)文法分析法(分析过程的C++实现)
- 编译原理LR分析法c++实现
- 编译原理(八) 算符优先分析法(分析过程的算法和C++实现)
- C++函数重载实现的原理以及为什么在C++中调用C语言编译的函数时要加上extern "C"声明
- c语言实现编译原理词法分析器
- 编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
- 编译原理(二) NFA的确定化及DFA的最小化的算法及C++实现
- 编译原理(八) 算符优先分析法(分析过程的算法和C++实现)
- 编译原理——Tiny词法分析器c++实现
- 编译原理(九) LR(0)文法分析法(算法描述和C++代码实现)
- Java 实现词法分析器(编译原理)
- 编译原理(六) LL(1)文法分析法(分析过程的C++实现)
- 编译原理(十) SLR文法分析法(算法原理和C++实现)
- 编译原理(一) Chomsky文法的判断方法及C++代码实现
- 编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
- C++函数编译原理和成员函数的实现
- 设计有穷自动机DFA实现C++简单程序的词法分析、扫描(编译原理实验) 推荐
- 编译原理--C-Minus词法分析器C++实现