资源描述:
《编译原理 语义分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、编译原理实验报告语义分析器姓名:闫梦丽班级:软件工程0901学号:0908010101日期:2012年4月1.题目要求:1.1实验目的通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。1.2实验原理采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。2.算法分析2.1主程序示意图图12.2设置语义过程emit(char*result,char*arg1,char*op,char*ag2)该函数功能是生成一个三地址语句送到四元式表中。四元式表的结构如下:struct{charresult[8];cha
2、rag1[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.3函数lrparser在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。3、实验步骤#include"stdio.h"#includ
3、e"string.h"#include"stdlib.h"charprog[100],token[8],ch;char*rwtab[6]={"begin","if","then","while","do","end"};intsyn,p,m,n,sum,q;intkk;struct{charresult1[8];charag11[8];charop1[8];charag21[8];}quad[20];char*factor();char*expression();intyucu();char*term();intstatement();intlrparser();char*new
4、temp();scaner();emit(char*result,char*ag1,char*op,char*ag2);main(){intj;q=p=kk=0;printf("pleaseinputastring(endwith'#'):");do{scanf("%c",&ch);prog[p++]=ch;}while(ch!='#');p=0;scaner();lrparser();if(q>19)printf("tolongsentense!");elsefor(j=0;j5、uad[j].ag11,quad[j].op1,quad[j].ag21);//getch();}intlrparser(){intschain=0;kk=0;if(syn==1){scaner();//读下一个单词符号schain=yucu();//调用语句串分析函数进行分析if(syn==6){scaner();//读下一个单词符号if((syn==0)&&(kk==0))printf("Success!");//输出(“success”)}else{if(kk!=1)printf("shortof'end'!");//输出‘缺end’错误kk=1;//getch()
6、;exit(0);}}else{printf("shortof'begin'!");//输出’begin’错误kk=1;//getch();exit(0);}return(schain);}intyucu(){intschain=0;schain=statement();//调用语句分析函数进行分析while(syn==26){scaner();//读下一个单词符号schain=statement();//调用语句分析函数进行分析}return(schain);}intstatement(){chartt[8],eplace[8];intschain=0;if(syn==10
7、){strcpy(tt,token);scaner();if(syn==18){scaner();//读下一个单词符号strcpy(eplace,expression());emit(tt,eplace,"","");schain=0;}else{printf("shortofsign':='!");//输出’缺少赋值号’的错误kk=1;//getch();exit(0);}return(schain);}}char*expression(){char*tp,*ep2,*ep