课程设计c语言词法分析器程序,课程设计-C语言子集的词法分析程序

《课程设计-C语言子集的词法分析程序》由会员分享,可在线阅读,更多相关《课程设计-C语言子集的词法分析程序(12页珍藏版)》请在人人文库网上搜索。

1、xx计算机科学与技术学院 实验报告*大学计算机科学与技术学院实 验 报 告 ( 2007 2008 学年度 第 1学期 )课程名称编译原理实验名称C语言子集的词法分析程序姓名学号专业班级地点教师一.实验目的及要求1、目的:通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法2、软、硬件环境:windows xp , Microsoft visual C+ .二.实验步骤1、原理分析,单词符号一般分为关键字、标识符、常数、运算符、界符号五种。对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词。

2、的类型是以上五种中之一,那么就以单词的二元式形式输出。每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串。各类单词的二元式表述均具有相同的结构与长度,形式如下:(单词种别,单词自身的值)是单词种别,而单词种别共分为五类且每类对应一张表格所以整个的词法分析过程就是从源程序中获得一个个的单词符号,将这些符号分别填入五张类表中,并且有一个二元式序列构成一个索引,这个索引为以后的语法分析提供处理上的方便为了方便期间本程序中引用了Const.txt 常量表 Sign.txt 标识符(32个)表。在这里将主要的保留字及标识符作一个列举(放在一个表。

3、中)。Key form单词种别t单词符号i单词种别t单词符号i单词种别t单词符号i1auto21short412break22sizeof423case23static434char24struct445const25switch45?6continue26union46:7default27unsigned478do28void48“”9double29while49;10else30typedef50.11enum31volatile51!12extern32signed52#13float33+5315goto35=55|16if36*56&17int37%57=18long38(58#。

4、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 (KEYWO。

5、RD_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 pointCT。

6、B = 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= /。

7、错误代码表/*0*/未知错误, /*1*/非法的字符, /*2*/不正确的字符常量表达,/*3*/不正确的字符串表达, /*4*/不正确的数字表达, /*5*/注释丢失*/;typedef struct signDualityint kind;int value;*pDualistic, Dualistic;void pretreatment(); /预处理void ProcError(int id); /错误bool GetChar(); /获得一个字符不包括结束标记bool GetBC(); /获得一个非空白字符void Concat(char *str); /将ch连接到str后int 。

8、Reserve(char *str); /对str字符串查找保留字表 若是一个保留字-返回其编码 否则返回0void Retract(); /将搜索指示器回调一个字符位置int InsertId(char *str);/将str串以标识符插入符号表,并返回符号表指针int InsertConst(char *str); /将str串以常数插入符号表,并返回常数表指针bool wordAnalyse(pDualistic pDu); /词法分析 true正常/预处理 将缓冲区内的源代码去掉注释和无效空格void pretreatment()int lines=0;char tmpPRO_MAX_。

9、LEN; /先将处理结果保存到临时空间int tmpp = 0; /这个临时空间的末尾指针bool flg;char tmpc;/去掉注释先/注释有两种 一种是/ 另一种是/*/point = 0;doflg = GetChar();if(ch = /)flg = GetChar();switch(ch)case /:doflg = GetChar(); while(!(ch = n | flg = false);/注释一直到行尾或文件结束if(ch = n)Retract(); /归还换行break;case *:doflg = GetChar();tmpc = ch;/为了保证出错处理程序。

10、能正确定位出错位置 保留注释中的换行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;elsetmptmpp+ = ch;while(flg);tmptmpp = 0;strc。

11、py(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; i kind = ID;pDu-value = value;elsepDu-kind = code;pDu-value = -1;return true;case D:while(isdigit。

12、(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; / GetC。

13、har();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 :cas。

14、e :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 = | ch = =) wordgeti+ = ch;e。

15、lse 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+ 。

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 *:/ * *=wordgeti+ = ch;GetChar();if 。

17、(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 = =)。

18、 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 filename20;printf(源代码读入n);/scanf(%s,filename);/将源程序读入缓冲区if (fin=fopen(Test.txt,r) = NU。

19、LL)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。

20、预处理成功,去掉注释后的源代码为: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,p。

21、tmp-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),w。

22、ordget);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;四.实验结果源程序运行结果:五. 实验总结分析通过本次实验,使我更深层次的掌握了词法分析。从刚开始的无从下手到后来渐渐的突破了各个难关,虽然花了大量的时间和精力,但在我看来这绝对是值得的。起码让我明白了,光有理论是苍白无力的,我们必须将他附注于实践才能升华。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值