编译原理实验报告.docx

上传人:b****7 文档编号:11096552 上传时间:2023-02-25 格式:DOCX 页数:16 大小:130.10KB
下载 相关 举报
编译原理实验报告.docx_第1页
第1页 / 共16页
编译原理实验报告.docx_第2页
第2页 / 共16页
编译原理实验报告.docx_第3页
第3页 / 共16页
编译原理实验报告.docx_第4页
第4页 / 共16页
编译原理实验报告.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

编译原理实验报告.docx

《编译原理实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告.docx(16页珍藏版)》请在冰豆网上搜索。

编译原理实验报告.docx

编译原理实验报告

 

编译原理实验报告

 

姓名:

***

班级:

***

学号:

***

指导老师:

***

 

实验一编译程序的分析与验证

1、实验目的:

熟练掌握LR分析表以及编译原理的基本过程,学会分析编译程序。

二、实验要求:

理论联系实际,将所学知识用到实处。

上机实验,验证老师给的代码的正确性,进而学会怎么写编译程序。

三、实验内容:

验证自己的文法的正确性,识别文法中的单词、句子、关键字、变量,等等。

验证下述程序输出结果的正确性:

while(a>b)do

begin

ifm>=nthena:

=a+1

else

whilek=hdox:

=x+2;

m:

=n+x*(m+y)

end#~

4、程序部分代码:

#include"stdio.h"

#include"string.h"

#defineACC-2

/**************************************/

#definesy_if0

#definesy_then1

#definesy_else2

#definesy_while3

#definesy_begin4

#definesy_do5

#definesy_end6

#definea7

#definesemicolon8

#definee9

#definejinghao10

#defineS11

#defineL12

#definetempsy15

#defineEA18

#defineE019

#defineplus34

#definesub35

#definetimes36

#definediv37

#definebecomes38

#defineop_and39

#defineop_or40

#defineop_not41

#definerop42

#definelparent48

#definerparent49

#defineident56

#defineintconst57

/********************算术表达式的LR分析表********************/

staticintaction1[14][9]=

{{-1,-1,-1,-1,2,-1,3,-1,1},

{4,5,6,7,-1,-1,-1,ACC,-1},

{-1,-1,-1,-1,2,-1,3,-1,8},

{106,106,106,106,-1,106,-1,106,-1},

{-1,-1,-1,-1,2,-1,3,-1,9},

{-1,-1,-1,-1,2,-1,3,-1,10},

{-1,-1,-1,-1,2,-1,3,-1,11},

{-1,-1,-1,-1,2,-1,3,-1,12},

{4,5,6,7,-1,13,-1,-1,-1},

{101,101,101,101,-1,101,-1,101,-1},

{102,102,102,102,-1,102,-1,102,-1},

{103,103,103,103,-1,103,-1,103,-1},

{104,104,104,104,-1,104,-1,104,-1},

{105,105,105,105,105,105,105,105,-1},

};

/********************布尔表达式的LR分析表*********************/

staticintaction2[16][11]=

{{1,-1,4,-1,5,-1,-1,-1,13,7,8},

{-1,2,-1,101,-1,101,101,101,-1,-1,-1},

{3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},

{-1,-1,-1,102,-1,102,102,102,-1,-1,-1},

{1,-1,4,-1,5,-1,-1,-1,11,7,8},

{1,-1,4,-1,5,-1,-1,-1,6,7,8},

{-1,-1,-1,104,-1,9,10,104,-1,-1,-1},

{1,-1,4,-1,5,-1,-1,-1,14,7,8},

{1,-1,4,-1,5,-1,-1,-1,15,7,8},

{105,-1,105,-1,105,-1,-1,-1,-1,-1,-1},

{107,-1,107,-1,107,-1,-1,-1,-1,-1,-1},

{-1,-1,-1,12,-1,9,10,-1,-1,-1,-1},

{-1,-1,-1,103,-1,103,103,103,-1,-1,-1},

{-1,-1,-1,-1,-1,9,10,ACC,-1,-1,-1},

{-1,-1,-1,106,-1,9,10,106,-1,-1,-1},

{-1,-1,-1,108,-1,9,10,108,-1,-1,-1}};

/********************从文件读一行到缓冲区**********************/

readline()

{

charch1;

pline=line;

ch1=fgetc(cfile);

while((ch1!

='\n')&&(ch1!

=EOF))

{

*pline=ch1;

pline++;

ch1=fgetc(cfile);

}

*pline='\0';

pline=line;

}

/***********************生成四元式**************************/

gen(charop1[],structaaarg11,structaaarg22,intresult1)

{

strcpy(fexp[nxq].op,op1);

fexp[nxq].arg1.sy1=arg11.sy1;

fexp[nxq].arg1.pos=arg11.pos;

fexp[nxq].arg2.sy1=arg22.sy1;

fexp[nxq].arg2.pos=arg22.pos;

fexp[nxq].result=result1;

nxq++;

returnnxq-1;

}

5、运行结果截图:

6、学习体会:

上课的时候,编译原理有很多地方不明白,在学习完了后对各个方面的知识精华不是不了解,通过本次实验后,我渐渐熟悉了编译程序的原理,对编译程序处理过程有了更清晰的认识,程序在词法分析,语法分析语义分析,代码生成都有了更清楚的体会,词法分析的步骤,状态栈加工过程的详细内容,以及这之中四元式的产生分析以及归约的一些内容。

实验二算术表达式的扩充

一、实验目的:

学会推到LR分析表,扩充算术表达式。

即:

将原来的扩展成+、-、× 、/。

二、实验要求:

参照算术表达式LR分析表的设计方法,设计扩充后的算术表达式LR分析表,并对原语义加工程序进行修改,加入新添加的内容。

三、实验内容:

算术表达式文法扩充如下:

E—>E+E|E-E|E*E|E/E|(E)|i

试根据该文法添加单词“-”、“/”的内部定义以及重新设计LR分析表,并修改语义加工程序,最后验证修改的结果。

四、程序修改部分代码:

#include"stdio.h"

#include"string.h"

#defineACC-2

/**************************************/

#definesy_if0

#definesy_then1

#definesy_else2

#definesy_while3

#definesy_begin4

#definesy_do5

#definesy_end6

#definea7

#definesemicolon8

#definee9

#definejinghao10

#defineS11

#defineL12

#definetempsy15

#defineEA18

#defineE019

#defineplus34

#defineminus35//增加的

#definetimes36

#definediv37//增加的

#definebecomes38

#defineop_and39

#defineop_or40

#defineop_not41

#definerop42

//#definesy_for43//addfor

#definelparent48

#definerparent49

#defineident56

#defineintconst57

/********************************************/

/********************算术表达式的LR分析表********************/

staticintaction1[14][9]=//修改3

{{3,-1,-1,-1,-1,2,-1,-1,1},

{-1,4,5,6,7,-1,-1,ACC,-1},

{3,-1,-1,-1,-1,2,-1,-1,8},

{-1,106,106,106,106,-1,106,106,-1},

{3,-1,-1,-1,-1,2,-1,-1,9},

{3,-1,-1,-1,-1,2,-1,-1,10},

{3,-1,-1,-1,-1,2,-1,-1,11},

{3,-1,-1,-1,-1,2,-1,-1,12},

{-1,4,5,6,7,-1,13,-1,-1},

{-1,101,101,6,7,-1,101,101,-1},

{-1,102,102,6,7,-1,102,102,-1},

{-1,103,103,103,103,-1,103,103,-1},

{-1,104,104,104,104,-1,104,104,-1},

{-1,105,105,105,105,-1,105,105,-1}};

case'+':

buf[count].sy1=plus;

count++;

break;

case'-':

//增加的

buf[count].sy1=minus;

count++;

break;

case'*':

buf[count].sy1=times;

count++;

break;

case'/':

//增加的

buf[count].sy1=div;

count++;

break;

case':

':

readch();

if(ch=='=')

buf[count].sy1=becomes;

count++;

break;

case'=':

buf[count].sy1=rop;

buf[count].pos=5;

count++;

break;

case';':

buf[count].sy1=semicolon;

count++;

break;

change1(intchan)//

{

switch(chan)

{

caseident:

caseintconst:

return0;

caseplus:

return1;

caseminus:

return2;//added

casetimes:

return3;

casediv:

return4;//added

caselparent:

return5;

caserparent:

return6;

casejinghao:

return7;

casetempsy:

return8;

}

}

switch(lr1)

{

case100:

break;//S'-->E

case101:

E.pos=newtemp();//E->E+E

gen("+",sstack[ssp-2],sstack[ssp],E.pos+100);

ssp=ssp-2;

sstack[ssp].sy1=tempsy;

sstack[ssp].pos=E.pos;

sp1=sp1-3;

break;

case102:

E.pos=newtemp();//E->E-E

gen("-",sstack[ssp-2],sstack[ssp],E.pos+100);

ssp=ssp-2;

sstack[ssp].sy1=tempsy;

sstack[ssp].pos=E.pos;

sp1=sp1-3;

break;

case103:

E.pos=newtemp();//E->E*E

gen("*",sstack[ssp-2],sstack[ssp],E.pos+100);

ssp=ssp-2;

sstack[ssp].sy1=tempsy;

sstack[ssp].pos=E.pos;

sp1=sp1-3;

break;

case104:

E.pos=newtemp();//E->E/E

gen("/",sstack[ssp-2],sstack[ssp],E.pos+100);

ssp=ssp-2;

sstack[ssp].sy1=tempsy;

sstack[ssp].pos=E.pos;

sp1=sp1-3;

break;

case105:

E.pos=sstack[ssp-1].pos;//E->(E)

ssp=ssp-2;

sstack[ssp].sy1=tempsy;

sstack[ssp].pos=E.pos;

sp1=sp1-3;

break;

case106:

E.pos=sstack[ssp].pos;//E->i

sp1--;

break;

}

n1.sy1=tempsy;

n1.pos=E.pos;

lrparse1(num);

}

验证程序:

//增加了减和除

while(a>b)do

begin

ifm>=nthena:

=a-1

else

whilek=hdox:

=x+2;

m:

=n+x/(m+y)

end#~

五、程序运行结果截图:

6、实验心得体会:

经过几次编译原理实验的课程,在李艳老师的指导下,我顺利完成了课程设计。

也是通过这次,感觉收获非常多,编译原理工作的基本过程和其各阶段所需要完成的任务。

书本上的知识晦涩难懂,实验让其逐渐明了,它让我把计算机科学与技术之间的许多个学科融会贯通,原本已经逐渐忘记的C语言,计算机操作系统,以及算法的分析,使我对计算机系统整个体系有了更深刻的认识。

理论固然重要,实践才是王道。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 法语学习

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

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