资源描述:
《语义网实习报告》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、语义网实习报告编译原理实验报告姓名:闫梦丽班级:软件工程学号:日期:语义分析器09010908010101XX年4月1•题目要求:实验目的通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法。实验原理采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。2.算法分析主程序示意图置初值调用scaner调用lrparser输出四元组结束图1设置语义过程emit该函数功能是生成一个三地址语句送到四元式表中。四元式表的结构如下:
2、struct{charresuIt[8];charagl[8];charop[8];charag2[8];}quad[20];char*newtemp该函数回送一个新的临时变量名,临时变量名产生的顺序为Tl,T2,•••・Char*newtemp{char*p;charm[8];p=malloc;k++;itoa;strcpy;p[0]二,t,:return;}函数lrparser在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。3、实
3、验步骤ttinclude〃〃#include〃〃#include/z//charprog[100],token[8],ch;char*rwtab[6]={"begi〃〃•厂〃〃,n,if,therT,z/whil〃〃1〃〃e,do,end"};intsyn,p,m,n,sum,q;intkk;struct{charresult1[8];charagl1[8];charop1[8];charag21[8];}quad[20];char*factor;char*expression;intyucu;
4、char*term;intstatement;intirparser;char*newtemp;scaner;emit;inain{intj;q=p=kk=Ojprintf:〃);do{seanf:prog[p++]=ch;}while;p=0;scaner;lrparser;ifprintf;elseforprintf;//getch;}intlrparser{intschain=0;kk=0;if{seaner;//读下一个单词符号schain二yucu;//调用语句串分析函数进行分析if{
5、scaner;//读下一个单词符号if)printf;//输出}else{ifprintf;kk=l;//getch;exit;}}else{printf;//输岀,begin,错误kk=l://getch;exit;}return;}intyucu{intschain=O;schain=statement;//调用语句分析函数进行分析//输出while{seaner;//读下一个单词符号schain=statement;//调用语句分析函数进行分析}return:}intstatemerit{
6、chartt[8],eplace[8];intschain=O;if{strepy;seaner;if{seaner;//读下一个单词符号strepy);emit;schain二0;}eIse{printf;//输出,缺少赋值号'的错误kk=1;//getch;exit;}return;}}char*expression{char*tp,*ep2,*eplace,*tt;tp=malloc;//分配空间ep2=malloc:eplace=malloc;tt二malloc:strepy);//调用
7、term分析产生表达式计算的第一项eplacewhile
8、I){ifstrcpy;//操作符tt=,+'或者'一,elsestrcpy;scaner;//读下一个单词符号strepy);//调用term分析产生表达式计算的第二项ep2strcpy);//调用newtemp产生临时变量tp存储计算结果emit;//生成四元式送入四元式表strcpy;}return;}char*term//仿照函数expression编写{char*tp,*ep2,*eplace,*tt;tp=malloc;ep2
9、=mal1oc;eplace=malloc;tt=malloc;strcpy);while
10、
11、){ifstrcpy;elsestrcpy;scaner;//读下一个单词符号strcpy);strcpy);emit;strcpy;}return;}char*factor{char*fplacejfplace=malloc;strcpy;if{strcpy;scaner;//读下一个单词符号}elseif{itoa;scaner;//读下一个单词符号}elseif{scaner://读下一个单词符号