文档介绍:编译原理语义分析实验报告
软工082班
兰洁
200831104044
实验内容
实验目的
实验要求
程序流程图
程序代码与主要过程说明
测试用例
输出结果
实验心得
实验内容
定义模拟的简单语言的语义成分,将语义分析程序编制成一个子程序,在实验2分析出个语法单位后,分析其含义,并将可执行语句或表达式翻译成四元式输出,并将错误信息输出。
实验目的
通过上机实验,加深对语义制导翻译原理的理解,掌握将语法分析所识别的语法成分变换成为中间代码的语义翻译方法。
实验要求
采用递归下降语法制导翻译方法,对算术表达式、赋值语句进行语义分析并生成四元式序列。
例如:对于语句串
Function
a=2+3*4;
x=(a+b)/c;
endfunc
#
输出的三地址指令如下
t1=3*4
t2=2+t1
a=t2
t3=a+b
t4=t3/c
x=t4
程序流程图
由于语义分析的的方法就是在语法分析过程中,根据每个产生式所对应的语义子程序进行翻译,为每个产生式配上一个翻译子程序,并在语法分析的同时执行这些子程序。所有对应的流程图与语法分析流程图大同小异,关于各类函数的流程图我已经在词法分析报告与语法分析报告中详细画出,所以这里只说明程序主要流程。
程序代码与主要过程说明
/*语义分析源代码*/
# include<>
# include<>
# include<>
# include<>
# include<>
struct quad // 四元式表
{ char result[12];
char ag1[12];
char op[12];
char ag2[12];
};
struct quad quad[30];
int count=0;
char *expression(void);
char prog[200],token[9];
char ch;
int syn,p,m,n,sum=0;
int kk=0,k=0;
char *rwtab[6]={"function","if","then","while","do","endfunc"};
void scaner()
{ m=0;
for(n=0;n<8;n++)
token[n]='\0';
ch=prog[p++];
while(ch==' ')
ch=prog[p++];
if((ch>='a'&& ch<='z')||(ch>='A' && ch<='Z'))
{
while((ch>='a'&& ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))
{ token[m++]=ch;
ch=prog[p++];
}//end of while
token[m++]='\0';
p--;
syn=10;
for(n=0;n<6;n++){
if(strcmp(token,rwtab[n])==0)
{ syn=n+1;
break;}
}//end of for
}
else if (ch>='0'&&ch<='9')
{ sum=0;
while(ch>='0'&&ch<='9')
{sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;
}
else
{ switch(ch)
{ case'<':m=0;token[m++]=ch;
ch=prog[++p];
if(ch=='=')
{ syn=22;
token[m+1]=ch;
}
else
{ syn=20;
ch=prog[--p];}
break;
case'>':m=0;token[m++]=ch;
ch=prog[++p];
if(ch=='=')
{ syn=24;
token[m++]=ch;
}
else
{ syn=23;
ch=prog[--p];
}
break;
case'=':m=0,token[m++]