




免费预览已结束,剩余10页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
#include #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 (1) /标识符#define CONST (3) /常量#define OPERAT (4) /运算符#define DIVIDE (2) /界符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_LENSTR_MAX_LEN; /常量表int pointCTB = 0; /常数表指针char kwTabKEYWORD_LEN60= /保留字表 ?字符指针数组? PROGRAM,VAR,BEGIN,DIV,END,INTEGER, AND,ARRAY,CASE,CONST,DO,DOWNTO,ELSE, FILE,FOR,FUNTION,GOTO,IF,IN,LABEL, MOD,NIL,NOT,OF,OR,PACKED,PROCEDURE;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(); /获得一个非空白字符void Concat(char *str); /将ch连接到str后int Reserve(char *str); /对str字符串查找保留字表 若是一个保留字-返回其编码 否则返回0void Retract(); /将搜索指示器回调一个字符位置int InsertId(char *str);/将str串以标识符插入符号表,并返回符号表指针int InsertConst(char *str); /将str串以常数插入符号表,并返回常数表指针bool wordAnalyse(pDualistic pDu); /词法分析 true正常/end/预处理 将缓冲区内的源代码去掉注释和无效空格【所谓的无效空格是指出现在非字符串/ 常量中的空格】void pretreatment() /预处理int lines=0; char tmpPRO_MAX_LEN; /先将处理结果保存到临时空间,这样虽然浪费空间但是节约 /时间 int tmpp = 0; /这个临时空间的末尾指针 bool flg; char tmpc; /去掉注释先 /注释有两种 一种是C+风格的/ 另一种是C风格的/*/ point = 0; do flg = GetChar(); if(ch = /) flg = GetChar(); switch(ch) / case /and * case /: do flg = GetChar(); while(!(ch = n | flg = false);/ | ch = 0);/注释一直到行尾或文件结束 if(ch = n) Retract(); /归还换行函数 break; case *: do flg = GetChar(); tmpc = ch; /为了保证出错处理程序能正确定位出错位置 保留注释中的换行 if(tmpc = n) tmptmpp+ = tmpc; flg = GetChar(); Retract(); /归还一个字符函数 while(flg & !(flg & tmpc = * & ch = /); /不以*/ flg = GetChar(); if (!flg) ProcError(5); /错误调用函数 5注释丢失 break; default: /不是任何一种注释 Retract(); /将搜索指示器回调一个字符位置 Retract(); /将搜索指示器回调一个字符位置 “/”或“*/” GetChar(); /获得一个字符不包括结束标记 tmptmpp+ = ch; flg = GetChar(); tmptmpp+ = ch; /tmpp临时空间的末尾指针 else tmptmpp+ = ch; while(flg); /flg布尔变量,判断是否取得字符 tmptmpp = 0; strcpy(proBuffer,tmp); / 新取得的字符送入缓冲区void ProcError(int id) /错误 printf(nError:第%d行,%sn,errorLine, errorTabid);/errorTabid错误列表bool GetChar()/获得一个字符不包括结束标记 if(point PRO_MAX_LEN & proBufferpoint != 0) /如果当前下标合法且当前字符为结束标记则取字符增游标 ch = proBufferpoint+; if (ch = n) errorLine +; return true; ch = 0; return false;bool GetBC()/获得一个非空白字符 do if(!GetChar() /获取字符失败 ch = 0; return false; while(isspace(ch); /直到获得一个非空白字符 /isspace(ch)判断字符ch是否为空白符 return true;void Concat(char *str) /将ch连接到str后 int i; for(i=0; stri; +i); stri = ch; stri+1 = 0;int Reserve(char *str)/对str字符串查找保留字表 若是一个保留字-返回其编码 否则返回0 int i; for(i=0; i 0) errorLine -; point -;int InsertId(char *str)/将str串以标识符插入符号表,并返回符号表指针 int i; for(i=0; i pointSTB; +i) / pointSTB符号表指针 if(0 = strcmp(signTabi, str) return i; strcpy(signTabpointSTB+, str); return (pointSTB-1);int InsertConst(char *str)/将str串以常数插入常量表,并返回常数表指针 int i; for(i=0; i kind = ID; pDu-value = value; else pDu-kind = code; pDu-value = -1; return true; case D: while(isdigit(ch) /isdigit(ch)判断字符ch是否为数字(0-9),是数字返回1,不是返回0; wordgeti+ = ch; GetChar(); /获得一个字符不包括结束标记 wordgeti = 0; Retract(); /回退一个字符 value = InsertConst(wordget);/将str串以常数插入符号表,并返回常数表指针 pDu-kind = CONST; pDu-value= value; return true;/().,! !=sizeof=&=|=?:+=/-=*=/=%=kind = ERROR; pDu-value = 0; else value = InsertConst(wordget); /将str串以常数插入符号表,并返回常数表指针 pDu-kind = CONST; pDu-value = value; return true; /字符常量 case : wordgeti+ = ch; / GetChar(); /获得一个字符不包括结束标记 wordgeti+ = ch; if(ch = ) / n /如果是转义字符则要多接收一个字符 GetChar(); / ch = wordgeti+ = ch; GetChar(); wordgeti+ = ch; wordgeti = 0; if(ch != ) /b printf(%s,wordget); ProcError(2); pDu-kind = ERROR; pDu-value = 0; else value = InsertConst(wordget);/将str串以常数插入符号表,并返回常数表指针 pDu-kind = CONST; pDu-value = value; return true; case (: case ): case : case : case .: case ,: case : case ?: case : case ;: case : case : case #: wordgeti+ = ch; wordgeti = 0; pDu-kind = DIVIDE; /界符 pDu-value = -1; return true; case !: /!= wordgeti+ = ch; GetChar();/获得一个字符不包括结束标记 if (ch=) wordgeti+ = ch; else Retract(); /将搜索指示器回调一个字符位置 wordgeti=0; break; case : / = wordgeti+ = ch; GetChar(); if (ch = : / = wordgeti+ = ch; GetChar(); if (ch = | ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break; case =: / = wordgeti+ = ch; GetChar(); if (ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break; case &: / & &= wordgeti+ = ch; GetChar(); if (ch = & | ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break; case |: / | |= wordgeti+ = ch; GetChar(); if (ch = | | ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break; case +: / + += wordgeti+ = ch; GetChar(); if (ch = + | ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break; case -: / - -= - wordgeti+ = ch; GetChar(); if (ch = - | ch = = | ch = ) wordgeti+ = ch; else Retract(); wordgeti=0; break; case *: / * *= wordgeti+ = ch; GetChar(); if (ch = * | ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break; case /: / /= wordgeti+ = ch; GetChar(); if (ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break; case %: / %= wordgeti+ = ch; GetChar(); if (ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break; case : / = wordgeti+ = ch; GetChar(); if (ch = =) wordgeti+ = ch; else Retract(); wordgeti=0; break; case 0: return false; default: ProcError(1); return false; pDu-kind = OPERAT; return true;int main() Dualistic tmp; pDualistic ptmp = &tmp; FILE *fin, *fout; int i; char c;cout=词法分析器=endl;cout=0407xxx X X X = PRO_MAX_LEN-1) / PRO_MAX_LEN 源程序最大长度 printf(n程序代码太长,无法处理a); return 0; proBufferi+ = c; fclose(fin); /关闭文件 proBufferi+ = 0; printf(tt *n词法读入成功,如下所示:n%s,proBuffer); printf(n请按任意键继续n); getch(); /预处理 printf(n*n); printf(n 预处理n); pretreatment();/预处理函数 printf(n*n预处理成功,去掉注释后的词法为:n%s*,proBuffer); printf(n请按任意键继续n); getch();/ 所谓的按任意键继续 printf(n*n); printf(n 词法分析n); printf(n*n); point = 0; /词法分析 if (fout=fopen(Result.txt,wb) = NULL) printf(建立文件Result.txt失败。n); return 0; i = 0; errorLine = 0; /错误行归零 do if(i+ PRO_MAX_LEN)/防止遇到BUG 导致程序死循环无限写文件 break; if(!wordAnalyse(ptmp) break; if (ptmp-value = -1) fprintf(fout, t,ptmp-kind); else fprintf(fout, t,ptmp-kind, ptmp-value); switch(ptmp-kind) case ERROR: fprintf(fout, (出 错:%s),wordget); break; case ID: fprintf(fout, (标识符:%s),wordget); break; case CONST: fprintf(fout, (常 量:%s),wordget); break; case OPERAT: fprintf(fout, (运算符:%s),wordget); break; case DIVIDE: fprintf(fout, (界 符:%s),wordget); break; default:; if(ptmp-kind = 5 & ptmp-kind kind-5); fprintf(fout, rn); while(1); fc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 骨科四肢创伤术后护理
- 物业经理年终总结
- 网络广告投放合同(样式三)7篇
- 运营类工作汇报
- 腰椎结核病历汇报
- 缺氧性脑病的护理查房
- 全职助理合同5篇
- 公司环卫安全培训课件
- 黑龙江省2025年全国成人高等学校招生统一考试数学(文)复习题库及答案
- 黑龙江省2025年全国成人高等学校招生统一考试英语(高起点)综合练习题及答案
- QC/T 262-2025汽车渗碳齿轮金相检验
- T-CFLP 0016-2023《国有企业采购操作规范》【2023修订版】
- 【NIFD】2025H1人民币汇率分析报告-“对等关税”加剧汇市震荡 美元指数步入贬值周
- 学习科学家家风+传承科学家精神(科技创新教育主题班会)-2025-2026学年高中主题班会
- 军事安全知识培训课件
- 2026届四川省广安市邻水县重点名校中考语文全真模拟试题含解析
- (高清版)DBJ∕T 13-318-2025 《建筑施工盘扣式钢管脚手架安全技术标准》
- 房颤射频消融病例报告
- 神经心理与皮纹特征-洞察及研究
- 护理病历讨论制度
- 电子病历系统集成与建设方案
评论
0/150
提交评论