- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理 语义分析 实验报告[实用论文]_精品
C.3语义分析
实验目的
通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法.
实验要求
采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。
实验的输入和输出
输入是语法分析提供的正确的单词串,输出为三地址指令形式的四元式序列。
例如:对于语句串
begin a:=2+3*4;x:=(a+b)/c end#
输出的三地址指令如下:
t1=3*4
t2=2+t1
a=t2
t3=a+b
t4=t3/c
x=t4
算法思想
1设置语义过程
emit(char *result,char *arg1,char *op,char *ag2)
该函数功能是生成一个三地址语句送到四元式表中。
四元式表的结构如下:
struct {char result[8];
char ag1[8];
char op[8];
char ag2[8];
}quad[20];
(2)char *newtemp()
该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,….
Char *newtemp(void)
{
char *p;
char m[8];
p=(char *)malloc(8);
k++;
itoa(k,m,10);
strcpy(p+1,m);
p[0]=’t’;
return(p);
}
(2)主程序示意图如图c.10所示。
函数lrparser在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。
语义分析程序的C语言程序框架
int lrparser()
{ int schain=0;
kk=0;
if(syn=1)
{ 读下一个单词符号;
schain=yucu; /调用语句串分析函数进行分析/
if(syn=6)
{ 读下一个单词符号;
if(syn=0 (kk==0))
输出(“success”);
}
else { if(kk!=1 ) 输出 ‘缺end’ 错误;kk=1;}
else{输出’begin’错误;kk=1;}
}
return(schain);
int yucu()
{ int schain=0;
schain=statement();/调用语句分析函数进行分析/
while(syn=26)
{读下一个单词符号;
schain=statement(); /调用语句分析函数进行分析/
}
return(schain);
}
int statement()
{ char tt[8],eplace[8];
int schain=0;
{switch(syn)
{case 10:
strcpy(tt,token);
scanner();
if(syn=18)
{读下一个单词符号;
strcpy(eplace,expression());
emit(tt,eplace,””,””);
schain=0;
}
else {输出’缺少赋值号’的错误;kk=1;
}
return(schain);
break;
}
}
char *expression(void)
{char *tp,*ep2,*eplace,*tt;
tp=(char *)malloc(12);/分配空间/
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt =(char )malloc(12);
strcpy(eplace,term ());/调用term分析产生表达式计算的第一项eplace/
while(syn=13 or 14)
{ 操作符 tt= ‘+’或者‘—’;
读下一个单词符号;
strcpy(ep2,term());/调用term分析产生表达式计算的第二项ep2/
strcpy(tp,newtemp());/调用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,
文档评论(0)