教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 行业资料 >

语义分析实验报告(实验三)

来源:网络收集 时间:2026-07-04
导读: 编译原理 语义分析器 包括试验要求 原理代码 代码可以成功运行 编译原理语义分析实验报告 软工082班 兰洁 200831104044 一、 实验内容 二、 实验目的 三、 实验要求 四、 程序流程图 五、 程序代码与主要过程说明 六、 测试用例 七、 输出结果 八、 实验心得

编译原理 语义分析器 包括试验要求 原理代码 代码可以成功运行

编译原理语义分析实验报告

软工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<stdio.h> # include<string.h> # include<conio.h> # include<malloc.h> # include<STDLIB.H>

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') } p--; syn=11;

{sum=sum*10+ch-'0'; ch=prog[p++];

编译原理 语义分析器 包括试验要求 原理代码 代码可以成功运行

{ case'<':m=0;token[m++]=ch;

ch=prog[++p]; if(ch=='=') { } else { syn=20;

ch=prog[--p];}

syn=22;

token[m+1]=ch;

break;

case'>':m=0;token[m++]=ch;

ch=prog[++p]; if(ch=='=') { syn=24; } else { syn=23; } break;

ch=prog[--p]; token[m++]=ch;

case'=':m=0,token[m++]=ch;

ch=prog[++p]; if(ch=='=') { syn=25; } else { syn=18; } break;

ch=prog[--p]; token[m++]=ch;

case'!':m=0;token[m++]=ch;ch=prog[++p];

if(ch=='=') { syn=22;

编译原理 语义分析器 包括试验要求 原理代码 代码可以成功运行

}

break;

case'+':syn=13;token[0]=ch;break; case'-':syn=14;token[0]=ch;break; case'*':syn=15;token[0]=ch;break; case'/':syn=16;token[0]=ch;break; case';':syn=26;token[0]=ch;break; case'(':syn=27;token[0]=ch;break; case')':syn=28;token[0]=ch;break; case'#':syn=0;token[0]=ch;break; default:syn=-1; }

}//end of scaner

void emit(char *result,char *ag1,char *op,char *ag2) //将三地址代码送到四元式表

{ strcpy(quad[count].result,result);

strcpy(quad[count].ag1,ag1);

strcpy(quad[count].op,op);

}

strcpy(quad[count].ag2,ag2); count++; return;

char *newtemp() //返回临时变量t1,t2...

{ char *p;

char m[8];

p=(char *)malloc(8); k++;

itoa(k,m,10); //功能将整数装换为字符串。并将值保存在m中。

10是基数 表示将k的值转化为10进制数。

}

char *factor() { char *fplace;

fplace=(char *)malloc(12); strcpy(p+1,m); p[0]='t'; return(p);

编译原理 语义分析器 包括试验要求 原理代码 代码可以成功运行

}

else if(syn==11) { itoa(sum,fplace,10); }

scaner(); scaner();

else if(syn==27)

}

char *term(void)

{ char *tp,*ep2,*eplace,*tt;

tp=(char *)malloc(12); { scaner(); } else

{ printf("\n'('ERROR"); }

return(fplace);

kk=1;

fplace=expression(); if(syn==28)

scaner();

else

{ printf("\n')'ERROR"); }

kk=1;

ep2=(char *)malloc(12); eplace=(char *)malloc(12); tt=(char *)malloc(12);

strcpy(eplace,factor()); while(syn==15||syn==16) {

if(syn==15) { tt[0]='*';

tt[1]='\0';}

else if(syn==16)

编译原理 语义分析器 包括试验要求 原理代码 代码可以成功运行

}

}

strcpy(ep2,factor());

strcpy(tp,newtemp()); //tp为临时变量

emit(tp,eplace,tt,ep2); //将三地址代码送到四元式表 strcpy(eplace,tp);

return(eplace);

char *expression()

{ char*tp,*ep2,*eplace,*tt; }

tp=(char*)malloc(12); ep2=(char*)malloc(12); eplace=(char*)malloc(12); tt=(char*)malloc(12); strcpy(eplace,term()); while(syn==13||syn==14) { if(syn==13) }

return(eplace);

{ tt[0]='+'; }

else if(syn==14) { tt[0]='-'; } scaner();

strcpy(ep2,term()); strcpy(tp,newtemp()); emit(tp,eplace,tt,ep2);// strcpy(eplace,tp);

tt[1]='\0'; tt[1]='\0';

statement()

{ char tt[8],eplace[8];

int schain=0; switch(syn)

编译原理 语义分析器 包括试验要求 原理代码 代码可以成功运行 …… 此处隐藏:3758字,全部文档内容请下载后查看。喜欢就下载吧 ……

语义分析实验报告(实验三).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/2275258.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)