13计科工编译原理实验报告模板课件.docx
《13计科工编译原理实验报告模板课件.docx》由会员分享,可在线阅读,更多相关《13计科工编译原理实验报告模板课件.docx(27页珍藏版)》请在冰豆网上搜索。
![13计科工编译原理实验报告模板课件.docx](https://file1.bdocx.com/fileroot1/2023-7/12/ab497036-5b2d-4083-89f8-bb8d908db7b6/ab497036-5b2d-4083-89f8-bb8d908db7b61.gif)
13计科工编译原理实验报告模板课件
院系:
计算机科学学院
专业、年级:
13级计科
(一)
课程名称:
编译原理(A)
组号:
18
学号姓名:
201321091048韩晗
学号姓名:
201321091053吴珊珊
学号姓名:
201321091055次珍
指导教师:
李航高周凌云
2016年6月10日
组号:
18实验类别:
综合型
组员
学号
姓名
201321091048
韩晗
201321091053
Wss
201321091055
次珍
实验名称
实验一:
词法分析
实验室
205
204
实
验
目
的
或
要
求
一.实验目的
通过编写一个具体的词法分析程序,加深对词法分析原理的理解。
掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字(关键字)、标识符、常数、运算符、分隔符五大类。
依次输出各个单词的内部编码及单词符号自身值。
实
验
原
理
(
算
法
流
程
)
二.实验原理
1.待分析的简单的词法
(1)关键字:
beginifthenwhiledoend
所有的关键字都是小写。
(2)运算符和界符
:
=+-*/<<=<>>>==;()#
(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:
ID=letter(letter|digit)*
NUM=digitdigit*
(4)空格有空白、制表符和换行符组成。
空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略
2. 输入:
所给文法的源程序字符串。
输出:
二元组(syn,token或sum)构成的序列。
其中:
syn为单词种别码;
token为存放的单词自身字符串;
sum为整型常数。
三、结果分析:
输入beginx:
=9:
ifx>9thenx:
=2*x+1/3;end#后经词法分析输出如下序列:
(begin1)(x10)(:
17)(=18)(911)(;26)(if2)……如图所示:
程
序
代
码
四.程序代码
#include
#include
charprog[80],token[8],ch;
intsyn,p,m,n,sum;
char*rwtab[6]={"begin","if","then","while","do","end"};
scaner();
voidscanner_example(FILE*fp);
main()
{
FILE*fp;
fp=fopen("D:
\\1.txt","r");//打开文件
scanner_example(fp);
scaner();
}
voidscanner_example(FILE*fp)
{
do
{
ch=fgetc(fp);
prog[p++]=ch;
}while(ch!
='#');
p=0;
do{
scaner();
switch(syn)
{case11:
printf("(%-10d%5d)\n",sum,syn);
break;
case-1:
printf("youhaveinputawrongstring\n");
default:
printf("(%-10s%5d)\n",token,syn);
break;
}
}while(syn!
=0);
}
(写不完时,可另加附页。
)
{sum=0;
for(m=0;m<8;m++)token[m++]=NULL;
ch=prog[p++];
m=0;
while((ch=='')||(ch=='\n'))ch=prog[p++];
if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
{while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
{token[m++]=ch;
ch=prog[p++];
}
p--;
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{syn=n+1;
break;
}
}
elseif((ch>='0')&&(ch<='9'))
{while((ch>='0')&&(ch<='9'))
{sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;
}
elseswitch(ch)
{case'<':
token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{syn=22;
token[m++]=ch;
}
else
{syn=20;
p--;
}
break;
case'>':
token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{syn=24;
token[m++]=ch;
}
else
{syn=23;
p--;
}
break;
case'+':
token[m++]=ch;
ch=prog[p++];
if(ch=='+')
{syn=17;
token[m++]=ch;
}
else
{syn=13;
p--;
}
break;
case'-':
token[m++]=ch;
ch=prog[p++];
if(ch=='-')
{syn=29;
token[m++]=ch;
}
else
{syn=14;
p--;
}
break;
case'!
':
ch=prog[p++];
if(ch=='=')
{syn=21;
token[m++]=ch;
}
else
{syn=31;
p--;
}
break;
case'=':
token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{syn=25;
token[m++]=ch;
}
else
{syn=18;
p--;
}
break;
case'*':
syn=15;
token[m++]=ch;
break;
case'/':
syn=16;
token[m++]=ch;
break;
case'(':
syn=27;
token[m++]=ch;
break;
case')':
syn=28;
token[m++]=ch;
break;
case'{':
syn=5;
token[m++]=ch;
break;
case'}':
syn=6;
token[m++]=ch;
break;
case';':
syn=26;
token[m++]=ch;
break;
case'\"':
syn=30;
token[m++]=ch;
break;
case'#':
syn=0;
token[m++]=ch;
break;
case':
':
syn=17;
token[m++]=ch;
break;
default:
syn=-1;
break;
}
token[m++]='\0';}
实
验
结
果
分
析
及
心
得
体
会
通过这次实验掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
发现了自己对程序逻辑设计的不足并进行了改进得到了提升。
和同学配合越来越默契,更觉得团队配合的默契度对程序的编写起着重要的作用。
词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
通过本试验的完成,更加加深了对词法分析原理的理解。
组
员
分
工
韩晗:
代码编写次珍:
程序检验,程序调试吴珊珊:
编写报告.程序调试
成
绩
评
定
教师签名:
2016年6月日
组号:
18实验类别:
综合型
组员
学号
姓名
201321091048
韩晗
201321091053
吴珊珊
201321091055
次珍
实验名称
实验二:
语法分析
实验室
205
实
验
目
的
或
要
求
一.实验目的
根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。
本次实验的目的主要是加深对递归下降分析法的理解。
注:
也可以采用预测分析方法、算符优先分析方法来进行分析。
具体参照课本上的说明,以下是递归下降分析法的介绍
实
验
原
理
(
算
法
流
程
)
二.实验效果图
1.主程序示意图
2.递归下降分析程序示意图
(写不完时,可另加附页。
)
程
序
界
面
(
效
果
图
)
3.语句串分析过程示意图
4.statement语句分析函数示意图
(写不完时,可另加附页。
)
5.expression表达式分析函数示意图
6.term分析函数示意图
7.factor分析过程示意图
三.实验结果
一、结果分析:
在d:
1.txt中输入begina:
=9;x:
=2*3;b:
=a+xend#后输出ok!
如图所示:
程
序
代
码
#include"stdio.h"
#include"string.h"
charprog[100],token[8],ch;
char*rwtab[6]={"begin","if","then","while","do","end"};
intsyn,p,m,n,sum;
intkk;
factor();//递归下降分析
expression();
yucu();
term();
statement();//语句串分析
parser();
scaner();
voidscanner_example(FILE*fp);
main()
{
p=kk=0;
FILE*fp;
fp=fopen("D:
\\1.txt","r");//打开文件
scanner_example(fp);
scaner();
parser();
}
voidscanner_example(FILE*fp)
{
do
{
ch=fgetc(fp);
prog[p++]=ch;
}while(ch!
='#');
p=0;
}
parser()//1
{
if(syn==1)
{
scaner();/*读下一个单词符号*/
yucu();//2/*调用yucu()函数;*/
if(syn==6)//end
{scaner();
if((syn==0)&&(kk==0))
printf("ok!
\n");
}
(写不完时,可另加附页。
)
else
{
if(kk!
=1)printf("thestringhaven'tgota'end'!
\n");
kk=1;
}
}
else
{
printf("haven'tgota'begin'!
\n");
kk=1;
}
return;
}//1
yucu()//2--段分析
{
statement();//3/*调用函数statement();*/
while(syn==26)//;
{
scaner();/*读下一个单词符号*/
if(syn!
=6)//end
statement();/*调用函数statement();*/
}
return;
}//2
statement()//3--句子分析
{
if(syn==10)//letter
{
scaner();/*读下一个单词符号*/
if(syn==18)//:
=
{
scaner();/*读下一个单词符号*/
expression();/*调用函数expression();*/
}
else
{
printf("thesing':
='iswrong!
\n");
kk=1;
}
}
else
{
printf("wrongsentence!
\n");
kk=1;
}
return;
}//3
expression()//4句子内部运算
{
term();
while((syn==13)||(syn==14))//+-
{
scaner();/*读下一个单词符号*/
term();/*调用函数term();*/
}
return;
}//4
term()//5
{
factor();
while((syn==15)||(syn==16))//*/
{
scaner();/*读下一个单词符号*/
factor();/*调用函数factor();*/
}
return;
}//5
factor()
{
if((syn==10)||(syn==11))//(letter|digit)
scaner();
elseif(syn==27)
{
scaner();/*读下一个单词符号*/
expression();/*调用函数expression();*///........//
if(syn==28)
scaner();/*读下一个单词符号*/
else
{
printf("theerroron'('\n");
kk=1;
}
}
else
{
printf("theexpressionerror!
\n");
kk=1;
}
return;
}//5
scaner()//6词法分析
{
sum=0;
for(m=0;m<8;m++)token[m++]=NULL;
m=0;
ch=prog[p++];
while(ch=='')ch=prog[p++];
if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
{
while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
{
token[m++]=ch;
ch=prog[p++];
}
p--;
syn=10;
token[m++]='\0';
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
elseif((ch>='0')&&(ch<='9'))
{
while((ch>='0')&&(ch<='9'))
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
p--;
syn=11;
}
elseswitch(ch)
{
case'<':
m=0;
ch=prog[p++];
if(ch=='>')
{
syn=21;
}
elseif(ch=='=')
{
syn=22;
}
else
{
syn=20;
p--;
}
break;
case'>':
m=0;
ch=prog[p++];
if(ch=='=')
{
syn=24;
}
else
{
syn=23;
p--;
}
break;
case':
':
m=0;
ch=prog[p++];
if(ch=='=')
{
syn=18;
}
else
{
syn=17;
p--;
}
break;
case'+':
syn=13;break;
case'-':
syn=14;break;
case'*':
syn=15;break;
case'/':
syn=16;break;
case'(':
syn=27;break;
case')':
syn=28;break;
case'=':
syn=25;break;
case';':
syn=26;break;
case'#':
syn=0;break;
case'if':
syn=2;break;
case'then':
syn=3;break;
case'wile':
syn=4;break;
case'do':
syn=5;break;
case'end':
syn=6;break;
case':
=':
syn=18;break;
case'<>':
syn=21;break;
case'<=':
syn=22;break;
case'>=':
syn=24;break;
default:
syn=-1;break;
}
}
实
验
结
果
分
析
及
心
得
体
会
通过这次实验加深对递归下降分析法的理解。
发现了自己对程序逻辑设计的不足并进行了改进得到了提升。
和同学配合越来越默契,更觉得团队配合的默契度对程序的编写起着重要的作用。
通过本次试验,了解了语法分析的运行过程,主程序大致流程为:
“置初值”调用scaner函数读下一个单词符号调用IrParse结束。
递归下降分析的大致流程为:
“先判断是否为begin”不是则“出错处理”,若是则“调用scaner函数”调用语句串分析函数“判断是否为end”不是则“出错处理”,若是则调用scaner函数“判断syn=0&&kk=0是否成立”成立则说明分析成功打印出来。
不成立则“出错处理”。
因为首先对词法分析进行了编写,在遇到语法分析的时候更得心应手了。
通过实验更加强了组员间的编程能力
组
员
分
工
次珍:
程序编写程序调试韩晗:
程序编写程序调试吴珊珊:
程序调试编写实验报告
成
绩
评
定
教师签名:
2016年6月日