1 / 14
文档名称:

实验三语义分析.doc

格式:doc   大小:180KB   页数:14页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

实验三语义分析.doc

上传人:mh900965 2017/12/1 文件大小:180 KB

下载得到文件列表

实验三语义分析.doc

相关文档

文档介绍

文档介绍:编译原理实验三语义分析

通过实验掌握语法制导分析的翻译理论、原理和方法,为为代码优化、生成做准备。
:
选择所学过的语义分析技术之一实现下面文法G的语义分析程序。
文法G:简单算术表达式的文法
E → T{+T|-T}
T → F{*F|/F}
F →(E) | a | b | c
简单算术表达式的运算分量只能是单词符号a、b、c
要求:
如果是文法正确句子,输出相应的四元组
输出是
Error 不是文法正确句子
例如
输入 a+b*c# 输出(*,entry (b),entry (c),t1)
(+,entry (a),t1,t2)
输入 a+c+b*c-a# 输出(+,entry (a),entry (c),t1)
(*,entry (b),entry (c),t2)
(+,t1,t2,t3)
(-,t3,entry (a),t4)
输入 d+f# 输出 error
输入 a+b*+c# 输出 error
输入 a(b)# 输出 error
:
上机前编写完整的实验报告,报告中要体现分析à设计à实现等几个过程;如无实验报告,则取消本次上机资格,实验成绩以0分记。
严禁相互抄袭,否则实验成绩以0分记;
有完整的源代码,源码有规范的注释,无明显的语法错误;

分析与设计
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);
}
编码实现
//对字符的扫描
void scaner() {
for(n=0;n<8;n++)
token[n]=NULL;
ch=prog[p++];
while(ch==' ') {
ch=prog[p];
p++;
}
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) {
if((ch>='a'&&ch<='c')||(ch>='A'&&ch<='C')){
m=0;
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) {
token[m++]=ch;
ch=prog[p++];
}
token[m++]='\0';
p--;
syn=10;
for(n=0;n<6;n++) {
if(strcmp(token,rwtab[n])==0) {
syn=n+1;
break;
}
}
}
else
cout<<"Error!"<<endl;

}
else if((ch>='0'&&ch<='9')) {
{
sum=0;
while((ch>='0'&&ch<='9')) {
sum=sum*10+ch-'0';
ch=prog[p++];
}
}
p--;
syn=11;
if(sum>32767)
syn=-1;
}
else switch(ch)
{
case'<':
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='>') {
syn=21;
token[m++]=ch;
}

else if(ch=='=')
{
syn=22;
token[m++]=ch;
}
else {
syn=23;
p--;
}
break;
case'>':
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='=') {
syn=24;
token[m++]