您的位置:首页 > 编程语言 > C语言/C++

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是预处理函数,读入文件,去掉注释,即自动检测“//”和“/*”,“*/”往后的字符

关键是如何去掉注释!

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ struct 语言 float 存储 c