文档介绍:编译原理语义分析实验报告
软工082班
兰洁
200831104044
、
实验内容
二、
实验目的
三、
实验要求
四、
程序流程图
五、
程序代码与主要过程说明
六、
测试用例
七、
输出结果
八、
实验心得
实验内容
定义模拟的简单语言的语义成分,将语义分析程序编制成一个子程序,在实验2分析出 个语法单位后,分析其含义,并将可执行语句或表达式翻译成四元式输出,并将错误信息输 出。
二、 实验目的
通过上机实验,加深对语义制导翻译原理的理解,掌握将语法分析所识别的语法成分变 换成为中间代码的语义翻译方法。
三、 实验要求
采用递归下降语法制导翻译方法,对算术表达式、赋值语句进行语义分析并生成四元式 序列。
例如:对于语句串
Function
a=2+3*4;
x二(a+b)/c;
endfunc
输出的三地址指令如下
t1=3*4
t2=2+tl
a=t2
t3二a+b
t4=t3/c
x=t4
四、 程序流程图
由于语义分析的的方法就是在语法分析过程中,根据每个产生式所对应的语义子程序进行翻 译,为每个产生式配上一个翻译子程序,并在语法分析的同时执行这些子程序。所有对应的 流程图与语法分析流程图大同小异,关于各类函数的流程图我已经在词法分析报告与语法分 析报告中详细画出,所以这里只说明程序主要流程。
开始
输入字符串
调用scanerQ进行词
法分析
调 川irpa/ker()进仃
语法分析并进行语
义子枫序翻译
输出二地址代码
五、 程序代码与主要过程说明
/*语义分析源代码*/
include〈stdio. h>
include〈string. h>
include<conio. h>
include〈malloc. h>
include<STDLIB. H>
struet quad // 四元式表
{ char resuIt [12];
char agl[12];
char op [12];
char ag2[12];
}; struet 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=O, k=0;
char *rwtab [6] = {,zfunctiorT, 〃if",气hen", 〃wh订e〃, 〃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'))
{
wh订e((ch>=,a && ch<=,z') | | (ch>二'A' &&ch〈二'Z') | | (ch>二'O' &&ch〈二'9')) { token[m++]=ch;
ch=prog[p++];
}//end of while
token[m++]=,\0';
P—;
syn=10;
for(n=0;n<6;n++){
if (stremp (token, rwtab [n] )=0)
{ syn=n+l;
break;}
}//end of for
}
else if (ch>二'O'&&ch〈二'9')
{ sum=0;
while (ch>=,O' &&ch〈二'9')
{sum=sum*10+ch-' O'; ch=prog[p++];
}
P—;
syn=ll;
else
switch(ch)
{ case'〈' :m二0;token[m++]二ch; ch=prog[++p];
if (ch二二'二')
{ syn=22;
token[m+l]=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++]二ch; ch=prog[++p];
if (ch二二'二')
{ syn=25;
token[m++]=ch;