已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
标 准 实 验 报 告(实验)课程名称 编译技术 实 验 报 告学生姓名: 学 号: 指导教师:实验地点: 实验时间:13.10.19一、实验室名称:通用计算机软件实验室 二、实验项目名称:词法分析器三、实验学时:4学时四、实验原理:单词单词表示的源程序词法分析程序字符串表示的源程序词法分析程序的实现方案五、实验目的:理解词法分析在编译程序中的作用,掌握词法分析的实现方法和技术,以加深对编译技术中词法分析的理解。六、实验内容:用C语言(或C+)对一个简单语言编制一个一遍扫描编译程序,扫描源程序字符,按语言的词法规则识别各类单词(如:语言的保留字、标识符、常数)、符号(如运算符、赋值符等),并将有关字符组合成为单词,完成相关转化和处理,最终以二元式形式输出。其中标识符和无符号整数各作为一类,保留字和符号一符一类。具体实验内容包括:1 从源程序的第一个字符开始,顺序地读字符,根据所读进的字符识别各类单词;2 将所识别的单词分类别分别存储到符号表;其中对常数完成数字字符串到数值的转换;3 删去空格、换行、制表等字符和注释。4 按要求输出源程序的“单词符号流”,并输出相应符号表的内容,以便检查。实验输出格式要求1 首先输出 自己姓名、学号;2 之后输出词法分析结果: 行号 + 词法分析结果二元式, 即: line xx: (单词类别,单词属性) 3 如果类别是标识符,还需要输出该标识符在符号表中的内容;4 如果类别是常数,还需要输出该常数的值 ;5 最后将词法分析结果打印到屏幕并输出到当前目录的 lex.txt 文件 6 将符号表内容 打印到屏幕并输出到当前目录的 symtab1.txt 文件 7 将词法错误 打印到屏幕 并 输出到error.txt七、实验器材(设备、元器件):硬件要求:pc机,CPU PII 以上,64M 内存,100M 硬盘空间即可。 软件要求:Windows 7/XP/2003等,包括C编译器的IDE。八、实验步骤、实验编程与运行结果:1.程序编码#include #include #include #define true 1#define false 0#define MAX 100#define MAX1 30#define $SYMBOL 1#define $CONSTANT 2#define $ADD 3#define $SUB 4#define $MUL 5#define $DIV 6#define $L 7#define $LE 8#define $G 9#define $GE 10#define $NE 11#define $E 12#define $ASSIGN 13#define $LPAR 14#define $RPAR 15#define $COM 16#define $SEM 17#define $INT 18#define $BEGIN 19#define $FUNCTION 20#define $IF 21#define $THEN 22#define $ELSE 23#define $END 24#define $READ 25#define $WRITE 26FILE *fp_print;FILE *fp_symbol;FILE *fp_error;FILE *fp;typedef struct Eys char BMMAX1;int n;Erys;Erys symMAX=0,consMAX=0; /*定义符号表和常数表*/char tokenMAX1,character=0,ret=0;int c=0,s=0,t,l=1;void Getchar()character=fgetc(fp);return ;void getnbc() /*读入非空白字符函数*/ while(character= |character=t) Getchar(); return ;void concat() /*连接字符串函数*/tokent=character;t=t+1;return; int letter() /*判断字母的函数*/if(character=A&character=a&character=0&character=9)return true;else return false;char retract() /*回退字符函数*/ret=character; return ret;int reserve() /*处理保留字的函数*/if(!strcmp(token,int)return $INT;if(!strcmp(token,begin)return $BEGIN;if(!strcmp(token,if)return $IF;else if(!strcmp(token,function)return $FUNCTION;else if(!strcmp(token,else)return $ELSE;else if(!strcmp(token,then)return $THEN;else if(!strcmp(token,read)return $READ;else if(!strcmp(token,write)return $WRITE;if(!strcmp(token,end)return $END;elsereturn 0;int symbol() /*处理标识符的函数*/int i=1;for(i;is)s=s+1;strcpy(syms.BM,token);fprintf(fp_symbol,%d:%sn,s,token);return s;int constant() /*常数存入常数表的函数*/int i=1;for(i;ic)c=c+1;strcpy(consc.BM,token);return c;void Return(int n,int i) printf(行数:%d ,l);fprintf(fp_print,行数:%d ,l);printf(%d,%d),n,i);fprintf(fp_print,(%d,%d),n,i);if(n=2)printf( 值为%d,atoi(token);fprintf(fp_print, 值为%d,atoi(token);printf(n);fprintf(fp_print,n);return ;void error() /*出错处理函数*/printf(代码第%d行出现错误.n,l);fprintf(fp_error,代码第%d行出现错误.n,l);void LexAnalyze() /*词法分析函数*/int val;for(int i=0;iMAX1;i+) tokeni=0; /*置token为空串*/ if(ret!=0)character=ret;getnbc();ret=0;elseGetchar(); getnbc(); /*读入非空白字符*/switch (character)case a: case b: case c: case d: case e: case f: case g:case h: case i: case j: case k: case l: case m: case n:case o: case p: case q: case r: case s: case t: case u:case v: case w: case x: case y: case z:while(letter()|digit() /*当前字符为字母或数字*/ concat(); Getchar();retract();int num=reserve();if(num!=0) Return(num,0); /*返回保留字*/elseval=symbol();Return($SYMBOL,val); /*返回标识符*/break;case 0: case 1: case 2: case 3: case 4: case 5: case 6:case 7: case 8: case 9:while(digit() /*当前字符为数字*/ concat();Getchar();retract();val=constant();Return($CONSTANT,val); /*返回常数*/break;case :Getchar();if(character=) Return($LE,0); /*返回=符号*/else retract();Return($L,0); /*返回:Getchar();if(character=)Return($GE,0); /*返回=符号*/elseretract();Return($G,0); /*返回符号*/break;case =:Getchar();if(character=)Return($E,0); /*返回=符号*/elseretract();Return($ASSIGN,0); /*返回=符号*/break;case !:Getchar();if(character=)Return($NE,0); /*返回!=符号*/else error();break;case +:Return($ADD,0); /*返回+符号*/break;case -:Return($SUB,0); /*返回-符号*/break;case *:Return($MUL,0); /*返回*符号*/break;case /:Return($DIV,0); /*返回/符号*/break;case (:Return($LPAR,0); /*返回(符号*/break;case ):Return($RPAR,0); /*返回)符号*/break;case ,:Return($COM,0); /*返回,符号*/break; case ;:Return($SEM,0); /*返回;符号*/break;case n: l=l+1;break;case #: break;default : error();break;return ;int main(void)fp_print=fopen(E:wxylex.txt,w);fp_symbol=fopen(E:wxysymtab1.txt,w);fp_error=fopen(E:wxyerror.txt,w);fp=fopen(E:wxyget.txt,r);if(fp=NULL)return 0;char ch=fgetc(fp);while(character!=#)t=0;LexAnalyze(); /*执行词法分析函数*/ printf(*符号表*n);for(int i=1;i=s;i+)printf(%d:%sn,i,symi.BM);fclose(fp_print);fclose(fp_symbol);fclose(fp_error);return 0; 2.文件get.txt截图:3.程序运行结果截图4.文件lex.txt截图:5.文件symtab1.txt的截图6.文件error.txt截图:九、实验结论:本实验用c语言编写的代码实现了词法分析器,其中编写了函数Character()、Getchar()、Getbc()等十几个函数,以词法分析器函数LexAnalyze()为主,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年内蒙古辅警招聘考试题库含答案详解(黄金题型)
- 2024年伊春辅警招聘考试题库附答案详解(轻巧夺冠)
- 2023年辽源辅警招聘考试题库附答案详解(满分必刷)
- 2024年内江辅警招聘考试真题附答案详解(综合卷)
- 2023年阿克苏辅警协警招聘考试备考题库含答案详解(黄金题型)
- 电镀整体杠铃行业深度研究报告
- 中国小鼓手摇摆游艺机项目投资可行性研究报告
- 中国石英立式舟项目投资可行性研究报告
- 欢乐的节日庆典记事的作文7篇范文
- 质量管理与检验记录标准手册
- 新能源汽车高压安全与防护考核试题及答案
- (2025年标准)宾馆赔偿和解协议书
- 2025 -2026年秋学期第一学期(21周)中小学国旗下讲话稿(第14周):法理如灯耀乾坤律心如磐守乾坤
- 职业生涯规划讲解要点
- 2025至2030中国体育培训行业市场发展分析及发展趋势与发展趋势分析与未来投资战略咨询研究报告
- 考前2025年河北省石家庄市辅警协警笔试笔试真题(含答案)
- 2025年交通运输安全管理考试试卷及答案
- 常规心电图检查操作指南
- 公司送礼品管理制度
- 十五五小学五年发展规划(2025-2025)
- 2025年天然食品防腐剂行业深度研究分析报告
评论
0/150
提交评论