




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理实验报告实验名称:分析调试语义分析程序实验类型:验证型指导教师:专业班级:姓 名:学 号: 实验地点:实验成绩: 日期: 2016 年 6 月 3 日 实验三 分析调试语义分析程序一、实验目的通过分析调试TEST语言的语义分析和中间代码生成程序,加深对语法制导翻译思想的理解,掌握将语法分析所识别的语法范畴变换为中间代码的语义翻译方法。2、 实验知识1.语法制导基本思想语法制导就是对文法中的每个产生式都附加一个语义动作或语义子程序,且在语法分析过程中,每当需要使用一个产生式进行推导或归约时,语法分析程序除执行相应的语法分析动作外,还要执行相应的语义动作或调用相应的语义子程序。基本思想是,
2、根据翻译的需要设置文法符号的属性,以描述语法结构的语义。例如,一个变量的属性有类型,层次,存储地址等。表达式的属性有类型,值等。属性值的计算和产生式相联系。随着语法分析的进行,执行属性值的计算,完成语义分析和翻译的任务。2. 翻译方案设计1)设计原理:在实验二的基础上为文法符号引进一组属性及相应求值规则和动作,得到属性翻译文法,并引进一个符号表(包括变量名,变量数据是否有效,变量地址,变量的具体数据,数据类型等),在进行语法分析的同时,结合符号表完成语义分析与检测,同时根据属性翻译文法的属性及相关动作得到中间代码(抽象机式汇编指令),最后通过模拟的抽象机运行出结果。2)设计方法:(为动作标志,
3、为继承属性,为综合属性)结合课本语法制导相关内容对文法增加属性和动作如下:以下列出有修改的属性翻译文法: vartablep,datap,codep int IDnname-defn,t;其中动作符号的含义如下 name-defn,t:插入符号表; if ()BRFlabel1BRlabel2 SETlabellabel1| if () BRFlabel1BRlabel2 SETlabellabel1else SETlabellabel2其中动作符号的含义如下 BRFlabel1 :输出 BRF label1; BRlabel2:输出 BR label2; SETlabellabel1:设置标
4、号label1; SETlabellabel2:设置标号label2;whileSETlabellabel1() BRFlabel2 BRlabel1 SETlabellabel2其中动作符号的含义如下SETlabellabel1:设置标号label1;BRFlabel2 :输出 BRF label2;BRlabel1:输出 BR label1;SETlabellabel2:设置标号label2;for (POP;SETlabellabel1BRFlabel2BRlabel3;SETlabellabel4 POPBRlabel1) SETlabellabel3 BRlabel4SETlabel
5、label2其中动作符号的含义如下SETlabellabel1:设置标号label1; BRFlabel2 :输出 BRF label2; BRlabel3:输出 BR label3;SETlabellabel4:设置标号label4;BRlabel1:输出 BR label1;SETlabellabel3:设置标号label3;BRlabel4:输出 BR label4;SETlabellabel2:设置标号label2; write OUT;其中动作符号的含义如下 OUT:输出 OUT read IDn LOOKnd INSTOdPOP;其中动作符号的含义如下LOOKnd:查符号表n,给出
6、变量地址d; 没有,变量没定义;IN:输出IN;STOd:输出指令代码STO d;POP:将栈顶元素出栈IDnLOOKndASSIGN=STOdPOP |其中动作符号的含义如下LOOKnd:查符号表n,给出变量地址d; 没有,变量没定义;ASSIGN:记住当前文件位置;STOd:输出指令代码STO d; |GT|LES|=GE|=LE|=EQ|!=NOTEQ其中动作符号的含义如下GT:次栈顶与栈顶作大于比较;LES:次栈顶与栈顶作小于比较;GE:次栈顶与栈顶作大于等于比较;LE:次栈顶与栈顶作小于等于比较;EQ:次栈顶与栈顶作等于比较;NOTEQ:次栈顶与栈顶作不等于比较;B+BADD | -
7、BSUB | +ADD | -SUB | 其中动作符号的含义如下ADD:操作数相加;SUB:操作数相减;C*CMULT | /CDIV | *MULT | /DIV | 其中动作符号的含义如下MULT:操作数相乘;DIV:操作数相除; ()| IDnLOOKndLOADd |NUMiLOADIi其中动作符号的含义如下LOOKnd:查符号表n,给出变量地址d; 没有,变量没定义;LOADd:将地址d的变量入栈;LOADIi:将常量i入栈;3)设计结果:1) 2) | 3) vartablep,datap,codep int IDnname-defn,t;4) | 5) | | |6) if ()
8、BRFlabel1BRlabel2 SETlabellabel1| if () BRFlabel1BRlabel2 SETlabellabel1else SETlabellabel27) whileSETlabellabel1()BRFlabel2 BRlabel1 SETlabellabel28) for (;SETlabellabel1BRFlabel2BRlabel3;SETlabellabel4 BRlabel1) SETlabellabel3 BRlabel29) write OUT;10) read IDn LOOKnd INSTOdPOP;11)12)POP;|;13) IDnL
9、OOKndASSIGN=STOdPOP |14) 15) GT|LES|=GE|=LE|=EQ|!=NOTEQ | 16) 17) +ADD | -SUB | 18) 19) *MULT | /DIV | 20) ()| IDnLOOKndLOADd |NUMiLOADIi三、实验过程首先,理解书上的代码和观看相关的知识的PPT,深入理解属性反应文法的作用,据此在我之前实验写好的语法分析基础上进行修改,写出语义分析代码。在语义分析里增加“不可引用未赋初值变量”的规则,在init()、showVarTable()、checkInitValue()中增加了相关操作。然后,结合栈式抽象机及其汇编指令
10、相关命令的操作含义,模拟写出TEST语言的抽象机模型用以运行文法生成的中间代码。最后,写出执行中间代码的虚拟机程序。最后,编写TEST语言程序进行代码实例测试,调试观察运行过程及结果,并调试修改程序BUG。代码完成后,测试、完善。/定义符号表结构,添加未赋初值记录structchar name8;int address;int notInit;/未赋初值vartablemaxvartablep;/改符号表最多容纳maxvartablep个记录/在插入符号表动作name-defn, t的程序中给notInit赋值为0,vartablevartablep.notInit =0;/在该函数给中判断n
11、otInit的值是否为0和查询表中是否有变量名,若查询表中有该变量名,且notInit为0时,将该变量的notInit赋值为1,表示已经判断已经赋值void init(char *name)/在该函数中首先判定变量是否声明,再判定notInit的值是否为0,若变量是声明了且notInit为0时,则判定变量未赋初值。void checkInitValue(char *name)4、 实验结果1) 测试数据及结果(初始程序)2) 修改后的测试数据:(给sum和product赋初值)运行结果如下3) 中间代码如下: 五、讨论与分析1、通过实验对课程知识点的理解实验后知识梳理与总结:通过TEST属性文
12、法的翻译设计,了解了语法制导的基本过程及方法,明白了属性文法的基本推导与构造原理,了解了不同属性之间的传递关系,动作的执行流程,也了解了栈式抽象机及其汇编指令的执行原理,了解了TEST语言抽象机的原理。语法制导:语法制导就是对文法中的每个产生式都附加一个语义动作或语义子程序,且在语法分析过程中,每当需要使用一个产生式进行推导或归约时,语法分析程序除执行相应的语法分析动作外,还要执行相应的语义动作或调用相应的语义子程序。每个语义子程序都指明了相应产生式中各个符号的具体含义,并规定了使用该产生式进行分析时所应采取的语义动作(如传送或处理信息、查填符号表、计算值、产生中间代码等等)。这种分析模式既把
13、语法分析与语义处理分开,又令其平行地进行,从而在同一遍扫描中同时完成语法分析和语义处理两项工作。语法制导的属性翻译:以语法分析为基础,伴随语法分析的各步骤,执行相应的语义动作;具体方法如下: 1将文法符号所代表的语言成分的意思,用属于该文法符号的属性表示; 2用语义规则(语义规则的执行就是语义动作)规定产生式所代表的语言成分之间的关系(即属性之间的关系),即用语义规则实现属性计算。 3.语义动作(语义规则的执行): 在语法分析的适当时刻(如推导或归约)执行附在对应产生式上的语义规则,以实现对语言结构语义的处理,如计算、查填符号表、生成中间代码、发布出错信息等。2、 回答实验指导书的实验思考提出
14、的问题。(1)语义及代码生成程序中的符号表管理方案存在什么问题?提出改进方案。答:按照原来书上的代码,符号表用的是数组栈,空间上容易造成浪费或溢出,可以使用map数组。但是我没有实现使用map数组。此外,原来的代码还没有检查是否赋初值,对引用了未赋初值的变量也检测不出来,为此我在符号表结构中增加了一个int类型的变量notInit来标记变量是否赋初值。(2)给出产生式所添加的动作含义。答:vartablep,datap,codep int IDnname-defn,t;其中动作符号的含义如下:name-defn,t:插入符号表;(3)给出产生式中所添加的动作含义。答: ()| IDnLOOKn
15、dLOADd |NUMiLOADIi其中动作符号的含义如下LOOKnd:查符号表n,给出变量地址d; 没有,变量没定义;LOADd:将地址d的变量入栈;LOADIi:将常量i入栈;(4)在抽象机模拟程序中是如何统计指令总数的?画出流程图并做说明答:由于抽象机使用的是书上后面的代码进行修改的,使用的用while循环来执行每条指令,用i来统计指令总数,将每一条指令与code进行比较,若两者相同则执行相应的操作。执行操作后i的次数加一,从而统计出指令总数。流程图如下:开始i|=|= maxvartablep)printf(符号表溢出n);exit(0);for(i=vartablep-1;i=0;i
16、-)/查符号表 if (strcmp(,name)=0)deal_Error(变量重复定义,wordLine);break;strcpy(,name);vartablevartablep.address=datap;vartablevartablep.notInit =0;datap+;/分配一个单元,数据区指针加1vartablep+;/查询符号表返回地址void lookup(char *name,int *paddress)int i;for(i=0;ivartablep;i+)if (strcmp(vartable
17、,name)=0)*paddress=vartablei.address;exit(0);deal_Error(变量未声明!, wordLine);/vartablep,datap,codep int IDnname-defn,t;void declaration_stat()if (strcmp(int, wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;if (strcmp(ID, wordType) = 0)fscanf(fp, %s %s %d, wordType, wor
18、dValue, &wordLine);wordAll+;name_def(wordValue);if (strcmp(;, wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;else deal_Error(声明语句缺少;, wordLine - 1);else deal_Error(声明语句ID错误, wordLine);else deal_Error(声明语句缺少int, wordLine);/*if ()BRFlabel1 BRlabel2 SETlabellabel1 else SETl
19、abellabel2*/void if_stat()int es = 0, label1, label2;if (strcmp(if, wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;if (strcmp(, wordType) = 0)/读到if表达式的左括号fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;expression();if (strcmp(), wordType) = 0)/读到if表达式的右括号la
20、bel1 = labelp+;/用label1记住条件为假时要转向的标号fprintf(fout, BRF LABEL%dn, label1);/输出假转移指令fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;statement();label2 = labelp+;/用label2记住要转向的标号fprintf(fout, BR LABEL%dn, label2);/输出无条件转移指令fprintf(fout, LABEL%d:n, label1);/设置label1记住的标号if (strcmp(else, word
21、Type) = 0)/读到if语句中的else部分fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;statement();else deal_Error(缺少), wordLine);else deal_Error(if语句缺少(, wordLine);else deal_Error(if语句错误, wordLine);fprintf(fout, LABEL%d:n, label2);/设置label2记住的标号/:= for(,)/*:=for (;SETlabellabel1BRFlabel2BRlabel3;SE
22、Tlabellabel4 BRlabel1) SETlabellabel3 BRlabel4SETlabellabel2 */void for_stat()int label1,label2,label3,label4; if (strcmp(for, wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;if (strcmp(, wordType) = 0)/读入for语句左括号fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAl
23、l+;expression();/for语句表达式1 判断fprintf(fout, POPn);if (strcmp(;, wordType) = 0)/读入for语句的第一个条件表达式后面的 ;label1 = labelp+;fprintf(fout, LABEL%d:n, label1);/设置label1标号fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;expression();/for语句条件表达式 2label2 = labelp+;fprintf(fout, BRF LABEL%dn, label2)
24、;/输出假条件转移指令label3 = labelp+;fprintf(fout, BR LABEL%dn, label3);/输出无条件转移指令if (strcmp(;, wordType) = 0)/读入for语句的第 二 个条件表达式后面的 ;label4 = labelp+;fprintf(fout, LABEL%d:n, label4);/设置label4标号fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;expression();/for语句条件表达式 3fprintf(fout, POPn);/fprin
25、tf(fout, BR LABEL%dn, label1);/输出无条件转移指令if (strcmp(), wordType) = 0)/for语句读入右括号fprintf(fout, LABEL%d:n, label3);/设置label3标号fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;statement();fprintf(fout, BR LABEL%dn, label4);/输出无条件转移指令fprintf(fout, LABEL%d:n, label2);/设置label2标号else deal_Erro
26、r(for语句缺少), wordLine);else deal_Error(for语句缺少;, wordLine);else deal_Error(for语句缺少;, wordLine);else deal_Error(for语句缺少(, wordLine);else deal_Error(for语句错误, wordLine);/()| IDnLOOKndLOADd |NUMiLOADIivoid factor()if (strcmp(, wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;ex
27、pression();if (strcmp(), wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;else deal_Error(factor缺少), wordLine);else if (strcmp(ID, wordType) = 0 | strcmp(NUM, wordType) = 0)int address;lookup(wordValue, &address);/查符号表,获取变量地址checkInitValue(wordValue);fprintf(fout, LOAD %dn
28、, address);fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;else deal_Error(factor错误, wordLine);/赋初值void init(char *name)int i;for(i=0;ivartablep;i+)if (strcmp(,name)=0&vartablei.notInit =0)vartablei.notInit = 1;/es=23;/变量没有声明deal_Error(变量没有声明, wordLine);/显示符号表void showVarTable()int i;printf(tt符号表n);printf(tt名字tt地址tt是否初值n);for(i=0;ivartablep;i+)printf(tt%s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届四川省绵阳地区九上化学期中预测试题含解析
- 广西柳州市柳江区2026届九年级英语第一学期期末预测试题含解析
- 矿山资源整合开发项目转让合同范本
- 离婚协议书参考:房产分割与子女抚养责任协议
- 水稻种植项目劳务分包与农业物联网合作合同
- 直播平台与主播的多元化权益合作协议
- 双方离婚协议中财产分割及共同债务承担执行协议
- 智能家居产品研发合伙协议退伙技术支持与退伙协议
- 智能商业租赁合同分割及物联网技术应用协议
- 高新技术研发项目合同风险评估与优化策略
- 车险诉讼案件培训课件
- 医院后勤技术人员考试试题及答案
- 产品开发版本管理办法
- 班干部聘任仪式
- 第2章-静电场和恒定电场
- 2025年老年病学住院医师规培出科考试理论笔试答案及解析
- 激光武器物理课件
- 气瓶泄漏应急演练范文大全
- 用户运营基础知识培训课件
- DBJT15-110-2015 广东省建筑防火及消防设施检测技术规程
- 2025年环境保护法知识竞赛题库(附含答案)
评论
0/150
提交评论