1 / 13
文档名称:

【精品】语义分析实验报告(实验三).doc

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

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

分享

预览

【精品】语义分析实验报告(实验三).doc

上传人:sssmppp 2021/2/18 文件大小:148 KB

下载得到文件列表

【精品】语义分析实验报告(实验三).doc

文档介绍

文档介绍:编译原理语义分析实验报告
软工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;