资源描述:
《语义分析思路》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、C.3语义分析实验目的通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法.实验要求采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。实验的输入和输出输入是语法分析捉供的正确的单词串,输出为三地址指令形式的四元式序列。例如:对于语句串begina:=2+3*4;x:=(a+b)/cend#输出的三地址指令如下:(1)tl=3*4(2)t2=2+tl(3)a=t2(4)t3=a+b(5)t4=t3/c(6)x=t4算法思想1
2、设置语义过程(1)emit(char*result,char*arg1,char*op,char*ag2)该函数功能是生成一个三地址语句送到四元式表中。四元式表的结构如下:struct{charresult[8];charagl[8];charop[8];charag2[8J;}quad[20];(2)char*newtemp()该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,•…Char^newtemp(void){char*p;charm[8];p=(char*)malloc(8)
3、;k++;itoa(k,m,10);strcpy(p+l,m);p[O]=f;return(p);}(2)主程序示意图如图c.10所示。置初值、调用,meaner/调用li•parser/输出四元组(结束)(2)函数lrparser在原來语法分析的基础上插入相应的语义动作:将输入申翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。语义分析程序的C语言程序框架intli*parser(){intschain=O;kk=O;if(syn=l){读下一个单词符号;schain=yucu;/调用语
4、句串分析函数进彳亍分析/if(syn=6){读下一个单词符号;if(syn=O&&(kk==O))输出(“success”);else{if(kk!=l)输出。缺end'错误;kk=l;}else{输出'begin'错误;kk=l;}}return(schain);intyucu(){intschain=O;schain=statement();/调用语句分析函数进行分析/while(syn=26){读下一个单词符号;schain=statement();/调用语句分析函数进彳亍分析/}return(
5、schain);}intstatement(){chartt[8],eplace[8];intschain=O;{switch(syn){case10:strcpy(tt,token);scanner();if(syn=18){读下一个单词符号;strcpy(eplace,expression());emit(tt,eplace,schain=0;}else{输出愀少赋值号'的错误;kk=l;}return(schain);break;char*expression(void){char*tp,*ep
6、2,*eplace,*tt;tp=(char*)malloc(12);/分配空间/ep2=(char*)malloc(12);eplace=(char*)malloc(12);tt=(char)malloc(12);strcpy(eplace,term());/调用tenn分析产生表达式计算的第一项eplace/while(syn=13or14){操作符或者‘一';读下一个单词符号;strcpy(ep2,term());/调用term分析产生表达式计算的第二项ep2/strcpy(tp,newtemp
7、());/i^用newtemp产生临时变量tp存储计算结果/emit(tp,eplace,tt,ep2);/生成四元式送入四元式表/strcpy(eplace,tp);}return(eplace);}char*term(void)/仿照函数expression编巧/char*factor(void){char*fplace;fplace=(char*)malloc(12);strcpy(fplace,“,');if(syn=10){strcpy(fplace„token);/将标识符token的值赋
8、给fplace/读下一个单词符号;}elseif(syn=ll){itoa(sum,fplace,10);读下一个单词符号;}else讦(syn=27){读下一个单词符号;fplace=expression();/调用expression分析返回表达式的值/if(syn=28)读下一个单词符号;else{输出错误;kk=l;}}else{输出"(,错误;kk=l;}return(fplace);