编译原理词法分析器代码

上传人:lis****211 文档编号:180631634 上传时间:2023-01-07 格式:DOCX 页数:12 大小:23.04KB
返回 下载 相关 举报
编译原理词法分析器代码_第1页
第1页 / 共12页
编译原理词法分析器代码_第2页
第2页 / 共12页
编译原理词法分析器代码_第3页
第3页 / 共12页
点击查看更多>>
资源描述
/保留字个数/标识符最大长度/源程序最大长度/符号表最大容量/常数表最大容量#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)/常量#define 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_LENSTR_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,void,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(); void Concat(char *str);/预处理/错误/获得一个字符不包括结束标记 /获得一个非空白字符 /将 ch 连接到 str 后int Reserve(char *str);/对 str 字符串查找保留字表 若是一个保留字-返回其编码 否则返回 0void Retract();/将搜索指示器回调一个字符位置int lnsertld(char *str);将str串以标识符插入符号表,并返回符号表指针int InsertConst(char *str);/将 str 串以常数插入符号表,并返回常数表指针bool wordAnalyse(pDualistic pDu);/词法分析 true 正常/预处理 将缓冲区内的源代码去掉注释和无效空格void pretreatment()int lines=0;char tmpPRO_MAX_LEN;/先将处理结果保存到临时空间int tmpp = 0;/这个临时空间的末尾指针bool flg;char tmpc;/去掉注释先/注释有两种 一种是/ 另一种是/*/point = 0;doflg = GetChar();if(ch = /)flg = GetChar();switch(ch)case /:doflg = GetChar();while(!(ch = n | fig = false);/注释一直到行尾或文件结束 if(ch = n)Retract();/归还换行break;do flg = GetChar(); tmpc = ch;/为了保证出错处理程序能正确定位出错位置 保留注释中的换行 if(tmpc = n)tmptmpp+ = tmpc;flg = GetChar();Retract();/归还一个字符while(flg & !(flg & tmpc = * & ch = /);flg = GetChar();if (!flg)ProcError(5);break;default:/不是任何一种注释Retract();Retract();GetChar();tmptmpp+ = ch;flg = GetChar(); tmptmpp+ = ch;else tmptmpp+ = ch;while(flg);tmptmpp = 0; strcpy(proBuffer,tmp); /错误void ProcError(int id)printf(nError:第4 行,sn,errorLine, errorTabid); /获得一个字符bool GetChar()if(point PRO_MAX_LEN & proBufferpoint != 0) /如果当前下标合法且当前字符为结束标记则取字符增游标 ch = proBufferpoint+;if (ch = n)errorLine +;return true;ch = 0;return false;/获得一个非空白字符bool GetBC()doif(!GetChar()/获取字符失败ch = 0; return false;while(isspace(ch);/直到获得一个非空白字符return true;/将 ch 连接到 str 后void Concat(char *str)int i;for(i=0; stri; +i);stri = ch;stri+1 = 0;/对str字符串查找保留字表若是一个保留字-返回其编码否则返回0int Reserve(char *str)int i;for(i=0; i 0) errorLine -;point -;将str串以标识符插入符号表,并返回符号表指针int InsertId(char *str)int i;for(i=0; i pointSTB; +i)if(0 = strcmp(signTabi, str)return i;strcpy(signTabpointSTB+, str);return (pointSTB-1);/将str串以常数插入常量表,并返回常数表指针int InsertConst(char *str)int i;for(i=0; i kind = ID;pDu-value = value;elsepDu-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;elsevalue = InsertConst(wordget); 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 != )/bprintf(%s,wordget);ProcError(2);pDu-kind = ERROR; pDu-value = 0;elsevalue = InsertConst(wordget); 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; elseRetract(); wordgeti=0; break;case : / = wordgeti+ = ch; GetChar();if (ch = : / = wordgeti+ = ch; GetChar();if (ch = | ch = =) wordgeti+ = ch; elseRetract(); wordgeti=0;break;case =: / = wordgeti+ = ch; GetChar();if (ch = =)wordgeti+ = ch;elseRetract();wordgeti=0; break;case &: / & &= wordgeti+ = ch;GetChar();if (ch = & | ch = =)wordgeti+ = ch;elseRetract();wordgeti=0;break; case |:/ | |=wordgeti+ = ch;GetChar();if (ch = | | ch = =)wordgeti+ = ch;elseRetract();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;elseRetract();wordgeti=0;break;case*:/* * *一wordgeti+ = ch;GetChar();if (ch = * | ch = =) wordgeti+ = ch;elseRetract();wordgeti=0; break;case /: / /= wordgeti+ = ch; GetChar();if (ch = =)wordgeti+ = ch; elseRetract();wordgeti=0; break;case %: / %= wordgeti+ = ch; GetChar();if (ch = =)wordgeti+ = ch; elseRetract();wordgeti=0; break;case s:/ A=wordgeti+ = ch; GetChar();if (ch = =)wordgeti+ = ch;elseRetract(); 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;char filename20;printf(源代码读入n);/scanf(%s,filename);/将源程序读入缓冲区if (fin=fopen(Test.txt,r) = NULL)printf(Cannot open infilen); return 0;i = 0;/c = fgetc(fin);while(c = fgetc(fin) != EOF)if(i = PRO_MAX_LEN-1)printf(n程序代码太长,无法处理a); return 0;proBufferi+ = c;fclose(fin);/关闭文件proBufferi+ = 0;printf(n*n源代码读入 成 功 , 源 代 码 如下:n%s,proBuffer);printf(n按任意键继续n); getch();/预处理printf(n 预处理n);pretreatment();printf(n*n 预 处 理 成 功去掉注释后的源代码为:n%s*,proBuffer);printf(n按任意键继续n);getch();printf(n 词法分析n);point = 0;/词法分析if (fout=fopen(Result.txt,wb) = NULL)printf(建立文件 Result.txt 失败。n); return 0;i = 0;errorLine = 0;/错误行归零doif(i+ PRO_MAX_LEN)防止遇到BUG导致程序死循环无限写文件 break;if(!wordAnalyse(ptmp)break;if (ptmp-value =-1)fprintf(fout, t,ptmp-kind);elsefprintf(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 = 1 & ptmp-kind kind-1);fprintf(fout, rn);while(1);fclose(fout);printf(写回常量表和标识符表n);常量表if (fout=fopen(Const.txt,wb) = NULL)printf(建立文件 Const.txt 失败。n); return 0;for(i = 0; i pointCTB; +i)fprintf(fout, %3d %srn,i, constTabi);fclose(fout);/标识符表if (fout=fopen(Sign.txt,wb) = NULL)printf(建立文件 Sign.txt 失败。n);return 0;for(i = 0; i pointSTB; +i)fprintf(fout, %3d %srn,i, signTabi);fclose(fout); printf(n写入完毕n按任意键继续n); getch();return 0;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!