




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编译方法实验报告实验1:扫描器的设计一、 实验目的熟悉并实现一个扫描器(词法分析程序)。二、 实验要求(1) 设计扫描器的有限自动机(识别器);(2) 设计翻译、生成Token的算法(翻译器);(3) 编写代码并上机调试运行通过。输入源程序文件或源程序字符串;输出相应的Token序列;关键字表和界符表;符号表和常数表;三、 实验步骤流程:初始化;打开用户源程序文件; while (文件未结束) 读入一行到wi,i=0;do /处理一行,每次处理一个单词 滤空格,直到第一个非空的wi;i-;s=1; /处理一个单词开始while (s!=0) /拼单词并生成相应Token act(s); /执行qs if (s=11 & s Then = Else = ”, ”=”, ”=”, “”, “=a & wi=0 & wi=11 & s=14) /*判断是否是终止状态 *是终止状态,则形成一个tokenbreak;i+; /getchar() *读取下一个字符 s=find(s,wi); /状态转换if (s=0)strTOKENi_str=0;printf(词法错误:%sn,strTOKEN);while (wi!=10); printf(关键字表:); /输出结果for (i=0;i30;i+)printf(%s ,keywordsi);printf(n); printf(Token序列:);for (i=0;inum_token;i+)printf(%d,%d),toki.code,toki.value);printf(n);printf(符号表:);for (i=0;inum_ID;i+)printf(%s ,IDi);printf(n);printf(常数表:);for (i=0;inum_C;i+)printf(%d ,Ci);printf(n);fclose(fp);printf(Hello World!n);return 0;/*状态转换后,达到新的状态之后,记录的变化void act(int s)int code;switch (s)case 1:n=0;m=0;p=0;t=0;e=1;num=0;i_str=0; strTOKENi_str=0; /其它变量初始化 break; case 2:n=10*n+wi-48; break; case 3:t=1; break; case 4:n=10*n+wi-48; m+; break; case 5:t=1; break; case 6:if (wi=-) e=-1; break; case 7:p=10*p+wi-48; break; case 8:strTOKENi_str+=wi; /将ch中的符号拼接到strTOKEN的尾部; break; case 9:strTOKENi_str+=wi; /将ch中的符号拼接到strTOKEN的尾部; break;case 10:strTOKENi_str+=wi; /将ch中的符号拼接到strTOKEN的尾部; break; case 11:num=n*pow(10,e*p-m); /计算常数值 toki_token.code=2; toki_token+.value=InsertConst(num); /生成常数Token num_token+;break;case 12:strTOKENi_str=0; code=Reserve(strTOKEN); /查关键字表 if (code) toki_token.code=code; toki_token+.value=0; /生成关键字Tokenelse toki_token.code=1; toki_token+.value=InsertID(strTOKEN); /生成标识符Token num_token+;break; case 13:strTOKENi_str=0; code=Reserve(strTOKEN); /查界符表 if (code) toki_token.code=code; toki_token+.value=0; /生成界符Token else strTOKENstrlen(strTOKEN)-1=0; /单界符 i-; code=Reserve(strTOKEN); /查界符表 toki_token.code=code; toki_token+.value=0; /生成界符Tokennum_token+;break; case 14:strTOKENi_str=0; code=Reserve(strTOKEN); /查界符表 toki_token.code=code; toki_token+.value=0; /生成界符Tokennum_token+;break;/*状态转换int find(int s,char ch)int i,col=7; struct map *p;p=ptr;for (i=0;istr,ch)col=(p+i)-col;break;return autscol;/*向常量表中插入常量int InsertConst(double num)int i;for (i=0;inum_C;i+)if (num=Ci)return i;Ci= (int)num;num_C+;return i;int Reserve(char *str)int i;for (i=0;inum_key;i+)if (!strcmp(keywordsi,str)return (i+3);return 0;/*向符号表中插入新的符号int InsertID(char *str)int i; for (i=0;inum_ID;i+)if (!strcmp(IDi,str) /*符号已经存在,则返回地址return i;strcpy(IDi,str);num_ID+;return i;六、 实验结果实验思考题:1.扫描器的任务是什么?答:词法分析程序又称扫描器,任务有:(1) 识别单词 从用户的源程序中把单词分离出来;(2) 翻译单词 把单词转换成机内表示,便于后续处理。2.扫描器、识别器、翻译器三者之间的关系是怎样的?答:扫描器、识别器、翻译器三者之间的关系是: 扫描器的实现要通过识别器和翻译器1. 为什么说有限自动机是词法分析的基础?答:因为词法分析的包括:识别- 识别单词的有限自动机。和翻译- 根据有限自动机所识别出的对象,完成从单词串到单词的TOKEN串的翻译。我们可以看出,不论是识别还是分析,都是应用有限自动机,所以可以说有限自动机是词法分析的基础。实验2:中间代码生成器的设计一、 实验目的熟悉算术表达式的语法分析与中间代码生成原理。二、 实验要求(1) 设计语法制导翻译生成表达式的四元式的算法;(2) 编写代码并上机调试运行通过。输入算术表达式输出语法分析结果相应的四元式序列(3) 本实验已给出递归子程序法的四元式属性翻译文法的设计,鼓励学生在此基础上进行创新,即设计LL(1)分析法或LR(0)分析法的属性翻译文法,并根据这些属性翻译文法,使用扩展的语法分析器实现语法制导翻译。三、 设计概要(1) 算术表达式文法 G(E): E E 0 T | T T T 1 F | FF i | (E)(2) 文法变换G(E) E T 0 T T F 1 FF i | (E)(3) 属性翻译文法: E T 0 “push(SYN, w)” T “QUAT” T F 1 “push(SYN, w)” F “QUAT”F i “push(SEM, entry(w)” | (E)其中: push(SYN, w) 当前单词w入算符栈SYN; push(SEM, entry(w) 当前w在符号表中的入口值压入语义栈SEM; QUAT 生成四元式函数 iT = newtemp; iiQTj =( SYNk, SEMs-1, SEMs, T); j+; iiipop( SYN, _ ); pop( SEM, _ ); pop( SEM, _ ); push( SEM, T );(4) 递归下降子程序: 数据结构:SYN 算符栈;SEM 语义栈; E: 入口 T: 入口 T F n 0? n 1? y y 出口 push(SYN, w) 出口 push(SYN, w) read(w) QUAT read(w) QUAT T F F: 入口 主程序:Z E ( ? n i ? n err read(w) read(w) push(SEM, entry(w) E E err n # ?err n ) ? y y 输出四元式序列 read(w)结束开始出口四、 实验核心代码void main() /主函数 t = 1; cout输入表达式,以#结束:=a&w=A&ww; /则读取下一字符w = E(w); if(w!=) /不是右括号则输入有误,报错cerr输入错误!endl;exit(0);else /否则有误,报错cerr输入错误!w; /读取下一字符return w;char E(char w) /E自动机string operate,a,b,c;string state5;w = T(w); while(w=+|w=-) /是加或减符号operate = w;cinw; /读入下一字符w = T(w); b = markStack.pop(); /字符栈弹出a = markStack.pop(); /两个操作字符cout(operate,a,b,tt)w; /读取下一字符w = F(w); b = markStack.pop(); /符号栈弹出a = markStack.pop(); /两个操作字符 cout(operate,a,b,tt)w;w = E(w); if(w=#) /遇到#则结束return true;elsereturn false;五、 实验结果实验思考题:1. 语法分析分为几类?其关键技术各是什么?答: 自顶向下法(推导法)从开始符号出发,采用推导运算,试图自顶向下构造语法树。 自底向上法(归约法) 从给定的符号串出发,采用归约运算,试图自底向上构造语法树。2. 什么是递归下降子程序法,什么是LL(1)分析法?二者对文法各有什么要求?答: 递归下降子程序法:递归子程序法属于自顶向下语法分析方法。故又名递归下降法。要求文法是LL(1)文法。 LL(1)分析法:LL(1)分析法是指从左到右扫描(第一个 L) 、最左推导(第二个 L)和只查看一个当前符号(括号中的 1)之意;LL(1)分析法又称预测分析法,属于自顶向下确定性语法分析方法。要求文法是LL(1)文法。3. 比较LL(1)分析法和递归下降子程序法的异同。答: 相同点:都要求文法是LL(1)文法;都是自顶向下的分析方法;都通过分析下个字符来判断该进入哪个状态或者调用哪个函数。 不同点:LL(1)分析法先建立起预测分析表,通过对分析栈的不断操作(出栈,入栈)来进行;递归下降子程序法是通过函数间的函数调用来实现不同状态间的转换,并简化了代码。4. 什么是语法制导翻译技术?其核心技术是什么?答:语法制导翻译是在语法分析过程中,随着分析(推导或归约)的逐步进展,每识别出一个语法结构,根据文法的每个规则所对应的语义子程序进行翻译的方法;核心技术是构造属性翻译文法。5. 表达式的四元式属性翻译文法如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专业装修公司合同样本
- 临街电梯出租合同样本
- led施工合同样本
- 公司货物销售合同样本
- 二手车汽车收购合同样本
- 人工机械租赁公司合同样本
- 关于车辆审合同样本
- 2025YY企业合同简易劳动合同范本
- 2025至2030年中国卷绕头成形板市场现状分析及前景预测报告
- 2025至2030年中国单螺旋浸渍式混合机行业投资前景及策略咨询报告001
- 股票账户托管合同
- 施工方案应经济技术指标合理
- 配音技巧知识课件
- 《草船借箭》课本剧剧本-4篇
- 《采购工作改进建议》课件
- 屋面防水工程方案
- 期中划重点:《经典常谈》重点题及答案
- 医美整形美容的面部抗衰老技术解析
- 第八课+建设法治中国【中职专用】中职思想政治《职业道德与法治》高效课堂(高教版2023·基础模块)
- 2024年山东出版集团有限公司招聘笔试参考题库含答案解析
- 医院公共卫生科制度、职责范文
评论
0/150
提交评论