编译基础学习知识原理实验报告3Word下载.docx

上传人:b****4 文档编号:16840449 上传时间:2022-11-26 格式:DOCX 页数:21 大小:112.76KB
下载 相关 举报
编译基础学习知识原理实验报告3Word下载.docx_第1页
第1页 / 共21页
编译基础学习知识原理实验报告3Word下载.docx_第2页
第2页 / 共21页
编译基础学习知识原理实验报告3Word下载.docx_第3页
第3页 / 共21页
编译基础学习知识原理实验报告3Word下载.docx_第4页
第4页 / 共21页
编译基础学习知识原理实验报告3Word下载.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

编译基础学习知识原理实验报告3Word下载.docx

《编译基础学习知识原理实验报告3Word下载.docx》由会员分享,可在线阅读,更多相关《编译基础学习知识原理实验报告3Word下载.docx(21页珍藏版)》请在冰豆网上搜索。

编译基础学习知识原理实验报告3Word下载.docx

+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模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1