资源描述:
《河北工业大学语义分析实验报告》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验三语义分析程序实现一、实验设计在实现词法、语法分析程序的基础上,编写相应的语义子程序,进行语义处理,加深对语法制导翻译原理的理解,进一步掌握将语法分析所识别的语法范畴变换为某种中间代码(四元式)的语义分析方法。基本实验题目:对文法G2[<算术表达式>]中的产生式添加语义处理子程序,完成运算对象是简单变量(标识符)和无符号数的四则运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。语法制导翻译模式是在语法分析的基础上,增加语义操作来实现的,实际上是对前后文无关文法的一种扩展。一般而言,首先需要根据进行的语义分析工作,完成对给定文法的必要拆分和语义动作的编写
2、,从而为每一个产生式都配备相应的语义子程序,以便在进行语法分析的同时进行语义解释。即在语法分析过程中,每当用一个产生式进行推导或归约时,语法分析程序除执行相应的语法分析动作之外,还要调用相应的语义子程序,以便完成生成中间代码、查填有关表格、检查并报告源程序中的语义错误等工作。每个语义子程序需指明相应产生式中各个符号的具体含义,并规定使用该产生式进行分析时所应采取的语义动作。这样,语法制导翻译程序在对源程序从左到右进行的一遍扫描中,既完成语法分析任务,又完成语义分析和中间代码生成方面的工作。本实验要求从编译器的整体设计出发,重点通过对实验二中语法分析程序的扩展,完成一
3、个编译器前端程序的编写、调试和测试工作,形成一个将源程序翻译为中间代码序列的编译系统。二、程序代码在词法分析和语法分析的基础上,完成了语义的分析,同样采用了头文件的形式,在VC++6.0中运行#include#include#include#include#include#include"cifa.h"#include"fenxibiao.h"#definePL15//+#defineMI16//-#defineMU17#defineDI18#defineacc100#def
4、ineMAXState20#defineNUMBER9//表达式的个数#defineMAXTEMP10//最多临时变量的个数intState[MAXState];//状态栈inti=0;intCURRENTSTATE=0;//标识当前状态intLENGTH[NUMBER]={1,3,3,1,3,3,1,3,1};//表达式右边的长度intlength;intindex;//索引intYes=0;//判断是否结束inttag=0;//判断是否需要调用词法程序//externchar*cifa();doublee1,t4,f7;//整形chare12[20],t42[2
5、0],f72[20];//字符型intTEMP[MAXTEMP];inttemp=0;intbiaoshifu=0;FILE*fp;voidREPORT_ERROR(){Yes=1;longf1=ftell(fp);charch=fgetc(fp);fseek(fp,-1,1);printf("语法错误,第%d个字符'%C'处",f1,ch);}voidAccept(){Yes=1;//printf("语法分析成功");}intINDEX(chara)//获取当前字符串对应的索引{inti;switch(a){case'E':i=8;return(i);br
6、eak;case'T':i=9;return(i);break;case'F':i=10;return(i);break;default:REPORT_ERROR();return(0);break;}}voidGen(inta,doublei1,doublei2,intt)//输出四元式{switch(a){casePL:printf("(+,%g,%g,%d)",i1,i2,t);break;caseMI:printf("(-,%g,%g,%d)",i1,i2,t);break;caseMU:printf("(*,%g,%g,%d)",i1,i2,t
7、);break;caseDI:printf("(/,%g,%g,%d)",i1,i2,t);break;default:break;}}voidyuyi(intn)//语义子程序{switch(n){case1:{temp++;//产生临时变量,Gen(PL,e1,t4,temp);e1=temp;break;}case2:{temp++;//产生临时变量,TEMP[temp]Gen(MI,e1,t4,temp);e1=temp;break;}case3:{e1=t4;break;}case4:{temp++;Gen(MU,t4,f7,temp);t4=te