编译基础学习知识原理实验报告3Word下载.docx
- 文档编号:16840449
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:21
- 大小:112.76KB
编译基础学习知识原理实验报告3Word下载.docx
《编译基础学习知识原理实验报告3Word下载.docx》由会员分享,可在线阅读,更多相关《编译基础学习知识原理实验报告3Word下载.docx(21页珍藏版)》请在冰豆网上搜索。
+TE'
|ε
T->
FT'
T'
*FT'
F->
(E)|I
3.递归下降子程序框图:
六、实验设计源程序
#include<
iostream.h>
charinputstream[50];
//存储输入句子
inttemp=0;
//数组下标
intright;
//判断输出信息
voide();
voide1();
voidt();
voidt1();
voidf();
voidmain()
{
right=1;
cout<
<
"
请输入您要分析的字符串以#结束(^为空字符):
endl;
cin>
>
inputstream;
e();
if((inputstream[temp]=='
#'
)&
&
right)
分析成功"
else
分析失败"
}
voide()
E->
t();
e1();
voide1()
if(inputstream[temp]=='
+'
)
E'
temp++;
if(inputstream[temp]!
='
||inputstream[temp]!
)'
T'
^"
return;
right=0;
voidt()
T->
f();
t1();
voidt1()
*'
inputstream[temp]!
voidf()
i'
F->
i"
('
(E)"
elseright=0;
七、运行结果
八、实验思考题
语法分析的任务是什么?
答:
语法分析器的任务是识别和处理比单词更大的语法单位,如:
程序设计语言中的表达式、各种说明和语句乃至全部源程序,指出其中的语法错误;
必要时,可生成内部形式,便于下一阶段处理。
九、实验体会
通过此次实验,让我了解到如何设计、编写并调试语法分析部分的相关程序,并加深对语法分析原理的理解;
熟悉了构造语法分析程序的手工方式的相关原理,使用某种高级语言(例如C++语言)直接编写此法分析程序。
另外,通过本次实验,也让我重新熟悉了C++语言的相关内容,加深了对C++语言知识的深化和用途的理解。
表达式中间代码生成
熟悉算术表达式的语法分析与中间代码生成原理。
1.构造算术表达式的四元式翻译文法
2.设计算术表达式的递归下降子程序分析算法
3.设计算术表达的四元式生成算法
4.实现代码并调试运行
1、采用递归下降语法制导翻译法,对算术表达式,赋值语句进行语义分析并
生成四元式序列.
2、输入是语法分析后提供的正确的单词串,输出四元式序列.
例如:
对于语句串
Begina:
=2+3*4;
x:
=(a+b)/cend#
输出的指令如下:
(1)t1=3*4
(2)t2=w+t1
(3)a=t2
(4)t3=a+b
(5)t4=t3/c
(6)x=t4
五、设计原理
1、原文法:
EVA_SENTENCEid:
=E
EEω0T
ET
TTω1F
TF
Fid
Fcons
F(E)
其中:
id——标识符;
cons——常数。
2、属性文法G’(E):
产生式语义规则规则编码
EVA_SENTENCEid:
=EQUAT(:
=);
EEω0TQUAT(ω0);
(1)
E.place:
=ti.entry;
ETE.place:
=T.place
TTω1FQUAT(ω1);
(1)
T.place:
TFT.place:
=F.place
FidF.place:
=id.entry
(2)
FconsF.place:
=cons.entry
(2)
F(E)F.place:
=E.place(3)
(1)QUAT(:
=)——生成一个赋值四元式;
.(:
=,E.place,_,id.entry);
.j++;
(2)QUAT(ω0)——生成一个运算四元式;
.ti:
=newt(i);
//申请一个临时变量
.(ω0,E.place,T.place,ti.entry);
.j++;
(3)QUAT(ω1)——类似QUAT(ω0)。
.(ω1,T.place,F.place,ti.entry);
六、程序设计的算法思想
1、设置语义过程
Emit(char*result,char*ag1,char*op,char*ag2)
该函数的功能是生成一个三地址语句送到四元式表达中.
2、四元式表达的结构如下:
Struct{
Charresult[8];
Charag1[8];
Charop[8];
Charag2[8];
}quad[20]
Char*newtemp()
该函数回送一个新的临时变量名,临时变量名产生的顺序为t1,t2,….
3、算法设计:
七、实验设计源程序
#include<
stdio.h>
string.h>
stdlib.h>
charprog[80],token[8];
charch;
intsyn,p,m,n,sum;
intkk=0,ii,N,nn=0;
intk=0,t,i=0;
chartt;
char*rwtab[6]={"
begin"
"
if"
then"
while"
do"
end"
};
intscaner();
intlrparser();
intstatement();
intyucu();
char*term();
char*factor();
char*expression();
voidemit();
struct
{
charresulted[8];
charag1ed[8];
charoped[8];
charag2ed[8];
}quad[20];
p=0;
printf("
……………………………………"
);
\npleaseinputstring:
\n"
……………………………………\n"
\n"
do
scanf("
%c"
&
ch);
prog[p++]=ch;
}while(ch!
='
p=0;
scaner();
lrparser();
char*newtemp(void)
char*P;
charM[8];
P=(char*)malloc(8);
k++;
itoa(k,M,10);
strcpy(P+1,M);
P[0]='
t'
;
return(P);
intlrparser()
intschain=0;
kk=0;
if(syn==1)
scaner();
schain=yucu();
if(syn=6)
{
scaner();
if(syn==0&
(kk==0))
printf("
success"
}
else
if(kk!
=1)
缺end错误"
kk=1;
}
else
printf("
begin错误"
kk=1;
return(schain);
intyucu()
schain=statement();
while(syn==26)
schain=statement();
return(schain);
intstatement()
chartt[8],eplace[8];
switch(syn)
case10:
strcpy(tt,token);
if(syn==18)
strcpy(eplace,expression());
emit(tt,eplace,"
schain=0;
else
printf("
缺少赋值号"
return(schain);
break;
char*expression(void)
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)
strcpy(ep2,term());
strcpy(tp,newtemp());
emit(tp,eplace,tt,ep2);
strcpy(eplace,tp);
return(eplace);
char*term(void)
strcpy(eplace,factor());
while(syn==15||syn==16)
strcpy(ep2,factor());
char*factor(void)
char*fplace;
fplace=(char*)malloc(12);
strcpy(fplace,"
"
if(syn==10)
strcpy(fplace,token);
elseif(syn==11)
itoa(sum,fplace,10);
elseif(syn==27)
strcpy(fplace,expression());
if(syn==28)
'
错误"
return(fplace);
voidemit(char*result,char*ag1,char*op,char*ag2)
strcpy(quad[nn].resulted,result);
strcpy(quad[nn].ag1ed,ag1);
strcpy(quad[nn].oped,op);
strcpy(quad[nn].ag2ed,ag2);
(%d)%s=%s%s%s\n"
nn+1,quad[nn].resulted,quad[nn].ag1ed,quad[nn].oped,quad[nn].ag2ed);
nn++;
scaner()
{
for(n=0;
n<
8;
n++)token[n]=NULL;
ch=prog[p++];
m=0;
while(ch=='
'
)ch=prog[p++];
if((ch>
a'
)&
(ch<
z'
))
{while((ch>
)||(ch>
0'
9'
token[m++]=ch;
}
token[m++]='
\0'
p--;
syn=10;
for(n=0;
6;
n++)
if(strcmp(token,rwtab[n])==0)
{syn=n+1;
break;
else
if(ch>
&
ch<
{sum=0;
while((ch>
(ch<
{sum=sum*10+(int)ch-'
p--;
syn=11;
switch(ch)
case'
:
m=0;
token[m++]=ch;
if(ch=='
{syn=21;
elseif(ch=='
{syn=22;
{syn=20;
token[m++]=ch;
{syn=24;
{syn=23;
{syn=18;
{syn=17;
syn=13;
token[0]=ch;
break;
-'
syn=14;
syn=15;
/'
syn=16;
syn=25;
syn=26;
syn=27;
syn=28;
syn=0;
default:
syn=-1;
returnsyn;
八、运行结果
1、输入错误时的情况:
2、输入正确时的情况:
通过此次实验,让我了解到如何设计、编写并调试语义分析部分的相关程序,并加深对语义分析原理的理解;
熟悉了构造语义分析程序的手工方式的相关原理,使用某种高级语言直接编写此法分析程序。
另外,通过本次实验,也让我重新熟悉了C语言的相关内容,加深了对C语言知识的深化和用途的理解。
通过这次语义分析的实验,我对高级语言的学习有了更深的认识,了解得更透彻。
我了解了高级语言转化为目标代码或汇编指令的过程,。
对今后的学习将起很大的作用,对以后的编程有很大的帮助.本次实验虽然只是完成了一个简单的程序,并且程序的主要框架课本上有给出,但在组织程序结构和深入了确上学到了很多,加深对编译原理的理解,掌握编译程序的实现方法和技术。
巩固了前面所学的知识。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 基础 学习 知识 原理 实验 报告