编译原理实验报告.docx
《编译原理实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
编译原理实验报告
编译原理实验报告
姓名:
***
班级:
***
学号:
***
指导老师:
***
实验一编译程序的分析与验证
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语言,计算机操作系统,以及算法的分析,使我对计算机系统整个体系有了更深刻的认识。
理论固然重要,实践才是王道。