资源描述:
《实验三:语义分析程序的设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验三语义分析程序的设计一、实验目的:加深对语法分析器工作过程的理解;能够采用一种编程语言实现简单的语义分析程序;能够使用自己编写的分析程序对简单的程序段进行语义分析,生成中间代码。二、实验内容:在实验2的基础上,用递归下降分析法编制语义分析程序,语义分析程序的实现可以采用任何一种编程工具。三、实验要求:1.对语法规则有明确的定义;2.编写的分析程序能够对实验二的结果进行正确的语义分析;3.*对于遇到的语法、语义错误,能够做出简单的错误处理,给出简单的错误提示,保证语义分析过程;4.实验报告要求用文法的形式对语义详细说明,说明语义分析程
2、序的工作过程,说明相应翻译动作的实现*。四、实验学时:4学时五、实验步骤:1.定义语法规则;2.设置语义过程,插入语义动作;3.*对遇到的语法、语义错误做出错误处理。六、选作实验内容学生可以根据自身的情况完善语义分析程序的错误处理功能,如对遇到的语义错误给出准确的位置和错误类型提示;或者给出语义分析程序的分析报告。附:算法思想:1、设置语义过程。(1)emit(char*result,char*ag1,char*op,char*ag2)该函数的功能是生成一个三地址语句送到四元式表中。四元式表的结构如下:struct{charresult
3、[8];charag1[8];charop[8];charag2[8];}quad[20];(2)char*newtemp()该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,…char*newtemp(void){char*p;charm[8];p=(char*)malloc(8);k++;itoa(k,m,10);strcpy(p+1,m);p[0]=’t’;return(p);}2、函数lrparser在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。源程序
4、代码:#include#include#include#includestruct{charresult[12];charag1[12];charop[12];charag2[12];}quad;charprog[80],token[12];charch;intsyn,p,m=0,n,sum=0,kk;//p是缓冲区prog的指针,m是token的指针char*rwtab[6]={"begin","if","then","while","do","end"
5、};voidscaner();char*factor(void);char*term(void);char*expression(void);intyucu();voidemit(char*result,char*ag1,char*op,char*ag2);char*newtemp();intstatement();intk=0;voidemit(char*result,char*ag1,char*op,char*ag2){strcpy(quad.result,result);strcpy(quad.ag1,ag1);strcpy(qu
6、ad.op,op);strcpy(quad.ag2,ag2);cout<7、p];p++;}if((ch>='a'&&ch<='z')
8、
9、(ch>='A'&&ch<='Z')){m=0;while((ch>='0'&&ch<='9')
10、
11、(ch>='a'&&ch<='z')
12、
13、(ch>='A'&&ch<='Z')){token[m++]=ch;ch=prog[p++];}token[m++]=' ';p--;syn=10;for(n=0;n<6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}elseif((ch>='0'&&ch<='9')){{sum=0
14、;while((ch>='0'&&ch<='9')){sum=sum*10+ch-'0';ch=prog[p++];}}p--;syn=11;if(sum>32767)syn=-1;}elseswitch(