编译原理词法分析器代码

上传人:第*** 文档编号:34262734 上传时间:2018-02-22 格式:DOCX 页数:20 大小:18.94KB
返回 下载 相关 举报
编译原理词法分析器代码_第1页
第1页 / 共20页
编译原理词法分析器代码_第2页
第2页 / 共20页
编译原理词法分析器代码_第3页
第3页 / 共20页
编译原理词法分析器代码_第4页
第4页 / 共20页
编译原理词法分析器代码_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《编译原理词法分析器代码》由会员分享,可在线阅读,更多相关《编译原理词法分析器代码(20页珍藏版)》请在金锄头文库上搜索。

1、#include #include #include #include #include #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) /常量 #de

2、fine OPERAT (KEYWORD_LEN+3) /运算符 #define DIVIDE (KEYWORD_LEN+4) /界符 int errorLine=0; char proBufferPRO_MAX_LEN = ; /存储程序代码的全局缓冲区 char ch; /读出来的当前字符 char wordgetSTR_MAX_LEN; /标识符 或 常量 int point = 0; /源程序当前位置指针 char signTabSTB_MAX_LENSTR_MAX_LEN; /符号表 int pointSTB = 0; /符号表指针 char constTabCTB_MAX_LENS

3、TR_MAX_LEN; /常量表 int pointCTB = 0; /常数表指针 char kwTabKEYWORD_LEN10= /保留字表 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, v

4、oid, volatile, while; char errorTab50= /错误代码表 /*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();

5、/获得一个非空白字符 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 正常/预处

6、理 将缓冲区内的源代码去掉注释和无效空格 void pretreatment() int lines=0; char tmpPRO_MAX_LEN; /先将处理结果保存到临时空间 int tmpp = 0; /这个临时空间的末尾指针 bool flg; char tmpc; /去掉注释先 /注释有两种 一种是/ 另一种是/*/ point = 0; do flg = GetChar(); if(ch = /) flg = GetChar(); switch(ch) case /: do flg = GetChar(); while(!(ch = n | flg = false);/注释一直到行

7、尾或文件结束 if(ch = n) Retract(); /归还换行 break; case *: do flg = GetChar(); tmpc = ch; /为了保证出错处理程序能正确定位出错位置 保留注释中的换行 if(tmpc = n) tmptmpp+ = tmpc; flg = GetChar(); Retract(); /归还一个字符 while(flg flg = GetChar(); if (!flg) ProcError(5); break; default: /不是任何一种注释 Retract(); Retract(); GetChar(); tmptmpp+ = ch

8、; flg = GetChar(); tmptmpp+ = ch; else tmptmpp+ = ch; while(flg); tmptmpp = 0; strcpy(proBuffer,tmp); /错误 void ProcError(int id) printf(nError:第%d 行,%sn,errorLine, errorTabid); /获得一个字符 bool GetChar() if(point 0) errorLine -; point -; /将 str 串以标识符插入符号表,并返回符号表指针 int InsertId(char *str) int i; for(i=0;

9、 i kind = ID; pDu-value = value; else pDu-kind = code; pDu-value = -1; return true; case D: while(isdigit(ch) wordgeti+ = ch; GetChar(); wordgeti = 0; Retract(); value = InsertConst(wordget); pDu-kind = CONST; pDu-value= value; return true; /( ) . , ! != sizeof = = = & & &= | | |= ?: + + += / - - - -= * *= / /= % %= = kind = ERROR; pDu-value = 0; else value = InsertConst(wordget); pDu-kind = CONST; pDu-value = value; return true; /字符常量 case : wordgeti+ = ch; / GetChar(); wordgeti+ = ch; if(ch = ) / n /如果是转义字符则要多接收一个字符 GetChar(); / ch = wordgeti+ = ch; GetChar();

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号