ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:18.54KB ,
资源ID:7176332      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7176332.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理词法分析器代码.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编译原理词法分析器代码.docx

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、+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 constTabC

3、TB_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, uns

4、igned, 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 G

5、etBC(); /获得一个非空白字符 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 & tmpc = * & ch = /); flg = GetChar(); if (!flg) ProcError(5); break; default: /不是任何一种注释 Retract(); Retract()

8、; GetChar(); tmptmpp+ = ch; 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 PRO_MAX_LEN & proBufferpoint != 0) /如果当前下标合法且当前字符为结束标记则取字符增游标 ch =

9、 proBufferpoint+; if (ch = n) errorLine +; return true; ch = 0; return false; /获得一个非空白字符 bool GetBC() do if(!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字符串查找保留字表 若是一个保留

10、字-返回其编码 否则返回0 int 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 *st

11、r) 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) wordgeti+ = ch; GetChar(); wordgeti = 0; Retract(); value = InsertConst(wordget); pDu-kind = CONST; pDu-value= value; return true; /( ) . , ! != sizeof = = = & & &= | | |=

12、?: + + += / - - - -= * *= / /= % %= = 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(); wordgeti+ = c

13、h; wordgeti = 0; if(ch != ) /b printf(%s,wordget); ProcError(2); pDu-kind = ERROR; pDu-value = 0; else value = 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; wor

14、dgeti = 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(); wordget

15、i=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+

16、 = 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 *:/ * *= wordge

17、ti+ = 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; c

18、ase : / = 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; char 20; printf(源代码读入n

19、); /scanf(%s,); /将源程序读入缓冲区 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);

20、 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; /错误行归零 do if(i+ PRO_MAX_LEN)/防止遇到BU

21、G 导致程序死循环无限写文件 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),w

22、ordget); 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,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1