实验三语义分析报告-.._第1页
实验三语义分析报告-.._第2页
实验三语义分析报告-.._第3页
实验三语义分析报告-.._第4页
实验三语义分析报告-.._第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编译原理实验报告实验名称:实验类型:9指导教师:专业班级:姓 名:学 号:实验地点:实验成绩:日期:2016年 6月 3日实验三 分析调试语义分析程序一、实验目的通过分析调试 TEST 语言的语义分析和中间代码生成程序, 加深对语法制导翻译思想的 理解,掌握将语法分析所识别的语法范畴变换为中间代码的语义翻译方法。二、实验知识1. 语法制导基本思想语法制导就是对文法中的每个产生式都附加一个语义动作或语义子程序, 且在语法分析 过程中, 每当需要使用一个产生式进行推导或归约时, 语法分析程序除执行相应的语法分析 动作外,还要执行相应的语义动作或调用相应的语义子程序。基本思想是,根据翻译的需要设置文

2、法符号的属性,以描述语法结构的语义。例如,一 个变量的属性有类型,层次,存储地址等。表达式的属性有类型,值等。属性值的计算和产 生式相联系。随着语法分析的进行,执行属性值的计算,完成语义分析和翻译的任务。2. 翻译方案设计1)设计原理:在实验二的基础上为文法符号引进一组属性及相应求值规则和动作,得 到属性翻译文法,并引进一个符号表(包括变量名,变量数据是否有效,变量地址,变量的 具体数据,数据类型等) ,在进行语法分析的同时,结合符号表完成语义分析与检测,同时 根据属性翻译文法的属性及相关动作得到中间代码(抽象机式汇编指令) ,最后通过模拟的 抽象机运行出结果。2)设计方法:(为动作标志,J为

3、继承属性,f为综合属性) 结合课本语法制导相关内容对文法增加属性和动作如下: 以下列出有修改的属性翻译文法: J vartablep,datap,codep int ID f nname-def J n,t;其中动作符号的含义如下name-def J n,t:插入符号表; t if ()BRF f label1BR f label2 SETIabel J label1| if () BRF f label1BR f label2 SETlabel J label1else SETlabel J label2其中动作符号的含义如下BRFf label1 :输出 BRF label1;BR f l

4、abel2 :输出 BR label2 ;SETlabel J label1 :设置标号 label1 ;SETlabel J label2 :设置标号 label2 ; t whileSETlabel f label1() BRF f label2BR J label1 SETlabel J label2其中动作符号的含义如下SETIabel f labell :设置标号 labell ;BRF f label2 :输出 BRF label2 ;BR J labell :输出 BR labell ;SETlabel J label2 :设置标号 label2 ; t for (POP;SET

5、Iabel f label1BRF f label2BR f label3;SETlabel f label4 POPBR J label1) SETlabel J label3 BR J label4SETlabel J label2其中动作符号的含义如下SETlabel J label1 :设置标号 label1 ; BRFf label2 :输出 BRF label2; BR f Iabel3 :输出 BR label3 ;SETlabel J label4 :设置标号 label4 ;BR f label1 :输出 BR label1 ;SETlabel J label3 :设置标号

6、label3 ;BR f label4 :输出 BR label4 ;SETlabel J label2 :设置标号 label2 ; t write OUT;其中动作符号的含义如下 OUT :输出 OUT t read IDf n LOOKJ nf d INSTO J dPOP;其中动作符号的含义如下LOOK J n f d:查符号表n,给出变量地址 d;没有,变量没定义; IN :输出 IN ;STO J d:输出指令代码 STO d;POP:将栈顶元素出栈 t ID f nLOOK J nf dASSIGN=STO J dPOP |其中动作符号的含义如下LOOK J n f d:查符号表

7、n,给出变量地址 d;没有,变量没定义;ASSIGN :记住当前文件位置;STO J d:输出指令代码 STO d; t |GT|LES|=GE|=LE|=EQ|!=NOTEQ其中动作符号的含义如下GT:次栈顶与栈顶作大于比较;LES :次栈顶与栈顶作小于比较;GE :次栈顶与栈顶作大于等于比较;LE :次栈顶与栈顶作小于等于比较;EQ:次栈顶与栈顶作等于比较;NOTEQ :次栈顶与栈顶作不等于比较;B t +BADD 卜BSUB |& t + vadditive_A ADD | - SUB | & 其中动作符号的含义如下ADD :操作数相加;SUB :操作数相减;Ct *CMULT | /C

8、DIV |& t *MULT | /DIV |&其中动作符号的含义如下MULT :操作数相乘;DIV :操作数相除;?t ()| ID f nLOOK J n f dLOAD J d |NUM fiLOADI J i其中动作符号的含义如下LOOK J n f d:查符号表n,给出变量地址d;没有,变量没定义;LOAD J d :将地址d的变量入栈;LOADI J i:将常量i入栈;3) 设计结果:1) t2) t vdeclaration_stat |&3) J vartablep,datap,codep tint ID f nname-defJ n,t;4) t vstateme nt|&5

9、) t | |6) tif ()BRF f label1BR f label2 SETlabelJ label1| if () BRF f label1BR f label2 SETlabel J label1else SETlabel J label27) t whileSETlabellabel1()BRF f label2 BR J label1 SETlabel J label28) t for (;SETlabel f label1BRF f label2BR f label3;SETlabel f label4 BR J label1) SETlabel J label3 BR J

10、 label29) twrite OUT;10) tread IDf n LOOK J nf d INSTO J dPOP;11) t 12) t POP;|;13) t ID f nLOOK J n f dASSIGN=STO J dPOP |14) t 15) tGT|LES|=GE|=LE|=EQ|!=NOTEQ |&16) t17) t +ADD | -SUB |&18) 19) *MULT | /DIV |&20) ()| ID f nLOOK J n f dLOAD J d |NUM f iLOADI J i三、实验过程首先,理解书上的代码和观看相关的知识的据此在我之前实验写好的语

11、法分析基础上进行修改,PPT,深入理解属性反应文法的作用,写出语义分析代码。 在语义分析里增加“不可引用未赋初值变量”的规则,在init()中增加了相关操作。、showVarTable()、checkInitValue()然后,结合栈式抽象机及其汇编指令相关命令的操作含义,模拟写出TEST语言的抽象机模型用以运行文法生成的中间代码。最后,写出执行中间代码的虚拟机程序。最后,编写TEST语言程序进行代码实例测试,调试观察运行过程及结果,并调试修改程序BUG。代码完成后,测试、完善。/定义符号表结构,添加未赋初值记录structchar n ame8;int address;int notInit

12、;/ 未赋初值vartablemaxvartablep; / 改符号表最多容纟内 maxvartablep 个记录/在插入符号表动作 name-defj n, t的程序中给notlnit赋值为0, vartablevartablep. no tI nit =0;/在该函数给中判断notlnit的值是否为0和查询表中是否有变量名,若查询表中有该变量名,且 not In it为0时,将该变量的n otl nit赋值为1,表示已经判断已经赋值void in it(char *n ame)/ /在该函数中首先判定变量是否声明,再判定n otl nit的值是否为0,若变量是声明了且n ot In it为

13、0时,则判定变量未赋初值。void check Ini tValue(char *n ame)四、实验结果1)测试数据及结果(初始程序)3圈文件锚迥惜式童看凹鶴助凹int sum;int product;int i;lint a;for ( i =1; i=10; i = i +1)read a:sum - sum +a;product - product+a;write sum;C:Windowssyssb a丈阵 彌惜式 M(v)seomiC:Windcwssysiinx sum; int product; int i :1一一 1 a 0( mum=or i s f+ 1= 1read

14、a,sum - sum +a; product - product*a;)_write sum;write product;)2)修改后的测试数据:(给sum和product赋初值)运行结果如下write product;文蛰H孺冨旧搭云型sfV)国旬囲int sum;int product:int i;int a;sum=0;product=l,for ( i =1; i=10, i = i +1)read a;sum = sum +a;product = product*a: _write sum;write product:|C:Windowssy&te3)中间代码如下:LABEL2:L

15、OADI 0STO 0POPLOADI 1STO 1POPLOADI 1STO 2POPLABELO:LOAD 2LOADI 10 LEBRF LABEL1 BR LABELSLABEL3:LOAD 2LOADI 1ADDSTO 2POPBR LABELOIN3TOoplrmopOADOADULTTOopBR LABEL3LABEL1:LOAD 0OUTLOAD 1OUTSTOP五、讨论与分析1通过实验对课程知识点的理解实验后知识梳理与总结:通过TEST属性文法的翻译设计, 了解了语法制导的基本过程及方法, 明白了属性文法 的基本推导与构造原理,了解了不同属性之间的传递关系, 动作的执行流程,

16、也了解了栈式 抽象机及其汇编指令的执行原理,了解了 TEST语言抽象机的原理。语法制导:语法制导就是对文法中的每个产生式都附加一个语义动作或语义子程序,且在语法分析过程中,每当需要使用一个产生式进行推导或归约时,语法分析程序除执行相应的语法分析动作外,还要执行相应的语义动作或调用相应的语义子程序。每个语义子程序都指明了相应产生式中各个符号的具体含义,并规定了使用该产生式进行分析时所应采取的语义动作(如传送或处理信息、查填符号表、计算值、产生中间代码等等)。这种分析模式既把语法分析与语义处理分开, 又令其平行地进行,从而在同一遍扫描中同时完成语法分析和 语义处理两项工作。语法制导的属性翻译: 以

17、语法分析为基础, 伴随语法分析的各步骤, 执行相应的语义动 作;具体方法如下:1 将文法符号所代表的语言成分的意思,用属于该文法符号的属性表示;2 用语义规则(语义规则的执行就是语义动作 )规定产生式所代表的语言成分之间的关 系(即属性之间的关系),即用语义规则实现属性计算。3语义动作(语义规则的执行):在语法分析的适当时刻(如推导或归约)执行附在对应产生式上的语义规则,以实现 对语言结构语义的处理,如计算、查填符号表、生成中间代码、发布出错信息等。2、回答实验指导书的实验思考提出的问题。(1)语义及代码生成程序中的符号表管理方案存在什么问题?提出改进方案。 答:按照原来书上的代码,符号表用的

18、是数组栈, 空间上容易造成浪费或溢出,可以使 用 map 数组。但是我没有实现使用map 数组。此外, 原来的代码还没有检查是否赋初值, 对引用了未赋初值的变量也检测不出来, 为 此我在符号表结构中增加了一个 int 类型的变量 notInit 来标记变量是否赋初值。( 2)给出 产生式所添加的动作含义。答: J vartablep,datap,codep int ID f nname-defj n,t;其中动作符号的含义如下 :name-def J n,t:插入符号表;(3)给出 产生式中所添加的动作含义。答: t()| ID f nLOOK J n f dLOAD J d |NUM f i

19、LOADI Ji其中动作符号的含义如下LOOK J n f d:查符号表n,给出变量地址d;没有,变量没定义; LOAD J d :将地址d的变量入栈;LOADI J i:将常量i入栈;(4)在抽象机模拟程序中是如何统计指令总数的?画出流程图并做说明答:由于抽象机使用的是书上后面的代码进行修改的,使用的用while 循环来执行每条指令,用 i 来统计指令总数,将每一条指令与 code 进行比较,若两者相同则执行相应的操 作。执行操作后 i 的次数加一,从而统计出指令总数。流程图如下:开始N结束i|=|= maxvartablep)printf( 符号表溢出 n);exit(0);for(i=v

20、artablep-1;i=0;i-)/ 查符号表if (strcmp(,name)=0)deal_Error( 变量重复定义 ,wordLine); break;strcpy(,name); vartablevartablep.address=datap;vartablevartablep.notInit =0;dat ap+;分配一个单元,数据区指针加1vartablep+;/查询符号表返回地址void lookup(char *name,int *paddress)int i;for(i=0;ivartablep;i+

21、)if (strcmp(,name)=0)*paddress=vartablei.address; exit(0);deal_Error( 变量未声明 !, wordLine); J vartablep,datap,codep int ID f nname-def J n,t; void declaration_stat()if (strcmp(int, wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine); wordAll+;if (strcmp(ID, wordType) = 0)f

22、scanf(fp, %s %s %d, wordType, wordValue, &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 ()

23、BRF f label1 BRf label2 SETlabelJ label1 else SETlabel J label2*/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

24、+; expression();if (strcmp(), wordType) = 0)/ 读到 if 表达式的右括号label1 = 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);/ 输出无条件转

25、移指令fprintf(fout, LABEL%d:n, label1);/ 设置 label1 记住的标号 if (strcmp(else, wordType) = 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,

26、 LABEL%d:n, label2);/ 设置 label2 记住的标号/:= for(,) /* :=for (;SETIabel f Iabel1BRF f label2BR f Iabel3;SETIabel f Iabel4 BR J labell)SETlabel J IabeI3 BR J IabeI4SETIabeI J IabeI2 */ void for_stat()int IabeI1,IabeI2,IabeI3,IabeI4;if (strcmp(for, wordType) = 0) fscanf(fp, %s %s %d, wordType, wordVaIue,

27、&wordLine); wordAII+;if (strcmp(, wordType) = 0)/ 读入 for 语句左括号fscanf(fp, %s %s %d, wordType, wordVaIue, &wordLine);wordAII+;expression();/for 语句表达式 1 判断 fprintf(fout, POPn);if (strcmp(;, wordType) = 0)/ 读入 for 语句的第一个条件表达式后面的 ; IabeI1 = IabeIp+;fprintf(fout, LABEL%d:n, IabeI1);/ 设置 IabeI1 标号 fscanf(f

28、p, %s %s %d, wordType, wordVaIue, &wordLine); wordAII+;expression();/for 语句条件表达式 2IabeI2 = IabeIp+;fprintf(fout, BRF LABEL%dn, IabeI2);/ 输出假条件转移指令IabeI3 = IabeIp+;fprintf(fout, BR LABEL%dn, IabeI3);/ 输出无条件转移指令if (strcmp(;, wordType) = 0)/读入 for 语句的第 二 个条件表达式后面 IabeI4 = IabeIp+;fprintf(fout, LABEL%d:

29、n, IabeI4);/ 设置 IabeI4 标号fscanf(fp, %s %s %d, wordType, wordVaIue, &wordLine);wordAII+;expression();/for 语句条件表达式 3fprintf(fout,POPn);/fprintf(fout, BR LABEL%dn,I a be I 1 ) ; /输出无条件转移指令if (strcmp(), wordType) = 0)/for 语句读入右括号fprintf(fout, LABEL%d:n, IabeI3);/ 设置 IabeI3 标号 fscanf(fp, %s %s %d, wordTy

30、pe, wordVaIue, &wordLine); wordAII+;statement();fprintf(fout, BR LABEL%dn, IabeI4);/ 输出无条件转移指令fprintf(fout, LABEL%d:n, IabeI2);/ 设置 IabeI2 标号eIse deaI_Error(for 语句缺少 ), wordLine);eIse deaI_Error(for 语句缺少 ;, wordLine);eIse deaI_Error(for 语句缺少 ;, wordLine);eIse deaI_Error(for 语句缺少 (, wordLine);eIse de

31、aI_Error(for 语句错误 , wordLine);/ t ()| ID f nLOOK J n f dLOAD J d |NUM f iLOADI J i void factor()if (strcmp(, wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;expression();if (strcmp(), wordType) = 0)fscanf(fp, %s %s %d, wordType, wordValue, &wordLine);wordAll+;else deal_Er

32、ror(factor 缺少), wordLine);else if (strcmp(ID, wordType) = 0 | strcmp(NUM, wordType) = 0)int address; lookup(wordV alue, &address);查符号表,获取变量地址 checkInitValue(wordValue);fprintf(fout, LOAD %dn, 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);/显示符号表vo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论