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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

实验三语义分析报告Word文件下载.docx

1、插入符号表; if ()BRFlabel1BRlabel2 SETlabellabel1| if () BRFlabel1BRlabel2 SETlabellabel1else SETlabellabel2 BRFlabel1 :输出 BRF label1; BRlabel2:输出 BR label2; SETlabellabel1:设置标号label1; SETlabellabel2:设置标号label2;whileSETlabellabel1() BRFlabel2 BRlabel1 SETlabellabel2SETlabellabel1:BRFlabel2 :输出 BRF label2

2、;BRlabel1:输出 BR label1;SETlabellabel2:for (POP;SETlabellabel1BRFlabel2BRlabel3;SETlabellabel4 POPBRlabel1) SETlabellabel3 BRlabel4SETlabellabel2SETlabellabel1: BRFlabel2 : BRlabel3:输出 BR label3;SETlabellabel4:设置标号label4;BRlabel1:SETlabellabel3:设置标号label3;BRlabel4:输出 BR label4; write OUT; OUT:输出 OUT

3、read IDn LOOKnd INSTOdPOP;LOOKnd:查符号表n,给出变量地址d; 没有,变量没定义;IN:输出IN;STOd:输出指令代码STO d;POP:将栈顶元素出栈IDnLOOKndASSIGN=STOdPOP |ASSIGN:记住当前文件位置; |GTLES=GELE=EQ!NOTEQGT:次栈顶与栈顶作大于比较;LES:次栈顶与栈顶作小于比较;GE:次栈顶与栈顶作大于等于比较;LE:次栈顶与栈顶作小于等于比较;EQ:次栈顶与栈顶作等于比较;NOTEQ:次栈顶与栈顶作不等于比较;B+BADD | -BSUB | +ADD | -SUB | ADD:操作数相加;SUB:操

4、作数相减;C*CMULT | /CDIV | *MULT | /DIV | MULT:操作数相乘;DIV:操作数相除; ()| IDnLOOKndLOADd |NUMiLOADIiLOOKnd:LOADd:将地址d的变量入栈;LOADIi:将常量i入栈;3)设计结果:1) statement_list2) | 3) 4) 5) | |6) 7) whileSETlabellabel1()BRFlabel2 8) ;BRlabel1) SETlabellabel3 BRlabel29) 10) 11)12)|;13) 14) 15) GT|LE|=EQ|!NOTEQ | 16) 17) 18)

5、19) 20) 三、实验过程首先,理解书上的代码和观看相关的知识的PPT,深入理解属性反应文法的作用,据此在我之前实验写好的语法分析基础上进行修改,写出语义分析代码。在语义分析里增加“不可引用未赋初值变量”的规则,在init()、showVarTable()、checkInitValue()中增加了相关操作。然后,结合栈式抽象机及其汇编指令相关命令的操作含义,模拟写出TEST语言的抽象机模型用以运行文法生成的中间代码。 最后,写出执行中间代码的虚拟机程序。最后,编写TEST语言程序进行代码实例测试,调试观察运行过程及结果,并调试修改程序BUG。 代码完成后,测试、完善。/定义符号表结构,添加未

6、赋初值记录struct char name8; int address; int notInit;/未赋初值vartablemaxvartablep;/改符号表最多容纳maxvartablep个记录/在插入符号表动作name-defn, t的程序中给notInit赋值为0,vartablevartablep.notInit =0;/在该函数给中判断notInit的值是否为0和查询表中是否有变量名,若查询表中有该变量名,且notInit为0时,将该变量的notInit赋值为1,表示已经判断已经赋值void init(char *name)/在该函数中首先判定变量是否声明,再判定notInit的值

7、是否为0,若变量是声明了且notInit为0时,则判定变量未赋初值。void checkInitValue(char *name)四、实验结果1)测试数据及结果(初始程序)2)修改后的测试数据:(给sum和product赋初值)运行结果如下3)中间代码如下:五、讨论与分析1、通过实验对课程知识点的理解实验后知识梳理与总结:通过TEST属性文法的翻译设计,了解了语法制导的基本过程及方法,明白了属性文法的基本推导与构造原理,了解了不同属性之间的传递关系,动作的执行流程,也了解了栈式抽象机及其汇编指令的执行原理,了解了TEST语言抽象机的原理。语法制导:每个语义子程序都指明了相应产生式中各个符号的具

8、体含义,并规定了使用该产生式进行分析时所应采取的语义动作(如传送或处理信息、查填符号表、计算值、产生中间代码等等)。这种分析模式既把语法分析与语义处理分开,又令其平行地进行,从而在同一遍扫描中同时完成语法分析和语义处理两项工作。语法制导的属性翻译:以语法分析为基础,伴随语法分析的各步骤,执行相应的语义动作;具体方法如下: 1将文法符号所代表的语言成分的意思,用属于该文法符号的属性表示; 2用语义规则(语义规则的执行就是语义动作)规定产生式所代表的语言成分之间的关系(即属性之间的关系),即用语义规则实现属性计算。 3.语义动作(语义规则的执行): 在语法分析的适当时刻(如推导或归约)执行附在对应

9、产生式上的语义规则,以实现对语言结构语义的处理,如计算、查填符号表、生成中间代码、发布出错信息等。2、回答实验指导书的实验思考提出的问题。(1)语义及代码生成程序中的符号表管理方案存在什么问题?提出改进方案。答:按照原来书上的代码,符号表用的是数组栈,空间上容易造成浪费或溢出,可以使用map数组。但是我没有实现使用map数组。此外,原来的代码还没有检查是否赋初值,对引用了未赋初值的变量也检测不出来,为此我在符号表结构中增加了一个int类型的变量notInit来标记变量是否赋初值。(2)给出产生式所添加的动作含义。其中动作符号的含义如下:name-defn,t:(3)给出= maxvartabl

10、ep) printf(符号表溢出n); exit(0); for(i=vartablep-1;i=0;i-)/查符号表 if (strcmp(vartablei.name,name)=0) deal_Error(变量重复定义,wordLine); break; strcpy(vartablevartablep.name,name); vartablevartablep.address=datap; vartablevartablep.notInit =0; datap+;/分配一个单元,数据区指针加1 vartablep+;/查询符号表返回地址void lookup(char *name,in

11、t *paddress) int i; for(i=0;ivartablep;i+) *paddress=vartablei.address; exit(0); deal_Error(变量未声明!, wordLine);/void declaration_stat() if (strcmp(int, wordType) = 0) fscanf(fp, %s %s %d, wordType, wordValue, &wordLine); wordAll+; if (strcmp(ID fscanf(fp, wordAll+; name_def(wordValue); if (strcmp( fs

12、canf(fp, wordAll+; else deal_Error(声明语句缺少;, wordLine - 1); else deal_Error(声明语句ID错误 else deal_Error(声明语句缺少int/*if ()BRFlabel1 BRlabel2 SETlabellabel1 else SETlabellabel2*/void if_stat() int es = 0, label1, label2;if(, wordType) = 0)/读到if表达式的左括号 expression();), wordType) = 0)/读到if表达式的右括号 label1 = lab

13、elp+;/用label1记住条件为假时要转向的标号 fprintf(fout, BRF LABEL%dn, label1);/输出假转移指令 statement(); label2 = labelp+;/用label2记住要转向的标号 BR LABEL%dn, label2);/输出无条件转移指令LABEL%d:n/设置label1记住的标号 if (strcmp(else, wordType) = 0)/读到if语句中的else部分 fscanf(fp, wordAll+; statement(); 缺少)if语句缺少(if语句错误 fprintf(fout, /设置label2记住的标号:= for(,)=for (BRlabel1) SETlabellabel3 BRlabel4SETlabellabel2 */void for_stat() int label1,label2,label3,label4;forwordLin

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

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