实验报告模版.docx
- 文档编号:30565267
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:16
- 大小:143.25KB
实验报告模版.docx
《实验报告模版.docx》由会员分享,可在线阅读,更多相关《实验报告模版.docx(16页珍藏版)》请在冰豆网上搜索。
实验报告模版
南华大学
计算机科学与技术学院
实验报告
(2010~2011学年度第一学期)
课程名称
程序设计语言与编译
实验名称
编制C语言子集的词法分析程序
姓名
张顺华
学号
20084440228
专业
计算机科学与技术
班级
082班
地点
八栋专业实验室
教师
肖建田老师
1.实验目的及要求
题目
使用直接分析法编制C语言子集的词法分析程序
目的
通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法.
要求
根据具体情况,由同学们自己选取C语言的一个适当大小的子集(可取一类典型单词,也可以尽可能使各种类型的单词都兼顾到);在实习前一定要制出相应的表
2.实验步骤
●分析语言特点
在C语言中,对于单词符号我们将其分成四类:
保留字K、标识符I、常数C和符号表S,每类单词符号均可使用一张表格表示.在词法分析过程中,保留字K和界符P这两个表格的内容是固定不变的(由语言确定),源程序字符串只能从其中选取,而标识符I、常数C这两表是在分析过程中不断形成的.
对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是K、I、C或P中之一,那么就以单词的二元式形式输出.每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串.
各类单词的二元式表述均具有相同的结构与长度,形式如下:
(单词种别t,单词自身的值i)
t是单词种别,而单词种别共分为K、I、C、P四类且每类对应一张表格.因此,t实际上就是一个指向这四类中某一类对应表格的指针.i则为指向该类表格中一个特定项目的指针.
所以整个的词法分析过程就是从源程序中获得一个个的单词符号,将这些符号分别填入四张类表中,并且有一个二元式序列构成一个索引,这个索引为以后的语法分析提供处理上的方便.
为了减少实习量,可以适量地选取K,P中的一个子集来进行.
●创建表格
表1 保留字K表
内部地址
1
2
3
4
5
6
7
保留字
int
if
else
while
for
read
write
表2 符号S表
内部地址
1
2
3
4
5
6
7
8
9
10
符号
+
-
*
/
<
>
=
<=
>=
!
=
内部地址
11
12
13
14
15
符号
==
(
)
;
保留字表包括7个有代表性的保留字,符号包括关系运算符6种(4,5,6,8,9,10,11),算术运算符(1,2,3,4),分隔符三种(14,15),一对圆括号,加上赋值号共15种.这两表的内容表明C语言的条件语句,赋值语句,WHILE型循环语句,复合语句,过程及变量说明均可作为源程序例子输入给词法分析程序,标识符表I中的每一项包含一个标识符,常数表C中的每一项包含一个整常数,后两表的内容都是在词法分析过程中产生的.
如何从源程序中识别出一个个的单词符号呢?
图1中的流图清晰地反映出这一过程.
图1中,双圆圈的状态表示终态,即能到达终态就代表识别出一个单词符号,而带有*号的终态是指处理时应回退一字符.
.
.
.
.
..
.
图1 扫描程序的状态转换图
●算法
词法分析器在扫描过程中,依次从源程序中取出源字符,根据图1的扫描过程状态转换图,当碰到终态时,即双圆圈的状态时就得到一个单词符号,此时可以根据第一个字符判断单词属于K,I,C,P中哪一类,从而确定单词的"单词种别"和"单词自身的值".整个词法分析的算法流程如图2.
三、实现环境
硬件:
安装AMD双核处理器和2G内存的PC机;
软件:
在WindowsXP操作系统下,并且安装有MCvisualc++6.0。
3.实验内容
源代码:
#include
#include
#include
#include
#defineSTART-1
#defineMAXSIZE20
FILE*fp;
FILE*fp1=fopen("PL词法分析结果.txt","w");
char*keyWord[]={"int","if","else","while","for","read","write"};
char*Operators[]={"+","-","*","/"};
char*compareOperators[]={"<","<=","=",">",">=","!
=","=="};
char*endOperators[]={",",";","(",")"};
boolCompare(charSearchStr[],inttype)
{
switch(type)
{
case1:
{
for(inti=0;i<=13;i++)
{
if(strcmp(keyWord[i],SearchStr)==0)
returntrue;
}
break;
}
case2:
{
for(inti=0;i<=3;i++)
{
if(strcmp(Operators[i],SearchStr)==0)
returntrue;
}
break;
}
case3:
{
for(inti=0;i<=5;i++)
{
if(strcmp(compareOperators[i],SearchStr)==0)
returntrue;
}
break;
}
case4:
{
for(inti=0;i<=7;i++)
{
if(strcmp(endOperators[i],SearchStr)==0)
returntrue;
}
break;
}
default:
break;
}
returnfalse;
}
charLetterProcess(charch)
inti=START;
charletter[MAXSIZE];
while(isalnum(ch)!
=0)
{
letter[++i]=ch;
ch=fgetc(fp);
};
letter[i+1]='\0';
if(Compare(letter,1))
{
printf("基本字:
%s\n",letter);
fprintf(fp1,"基本字:
\t\t%s\n",letter);
}
else
{
printf("标识符:
%s\n",letter);
fprintf(fp1,"标识符:
\t\t%s\n",letter);
}
returnch;
}
charNumberProcess(charch)
inti=START;
charnumber[MAXSIZE];
while(isdigit(ch)!
=0)
{
number[++i]=ch;
ch=fgetc(fp);
}
if(isalpha(ch)!
=0)
{
while(isspace(ch)==0)
{
number[++i]=ch;
ch=fgetc(fp);
}
number[i+1]='\0';
printf("非法标识符:
%s\n",number);
fprintf(fp1,"非法标识符:
\t%s\n",number);
returnch;
}
number[i+1]='\0';
printf("数字:
%s\n",number);
fprintf(fp1,"数字:
\t\t%s\n",number);
returnch;
}
charOtherProcess(charch)
{
inti=START;
charotherChar[MAXSIZE];
if(isspace(ch)!
=0)
{
ch=fgetc(fp);
returnch;
}
while((isspace(ch)==0)&&(isalnum(ch)==0))
{
otherChar[++i]=ch;
ch=fgetc(fp);
}
otherChar[i+1]='\0';
if(Compare(otherChar,2))
{
printf("运算符:
%s\n",otherChar);
fprintf(fp1,"运算符:
\t\t%s\n",otherChar);
}
elseif(Compare(otherChar,3))
{
printf("比较符:
%s\n",otherChar);
fprintf(fp1,"比较符:
\t\t%s\n",otherChar);
}
elseif(Compare(otherChar,4))
{
printf("界符:
%s\n",otherChar);
fprintf(fp1,"界符:
\t\t%s\n",otherChar);
}
else
{
printf("非法标示符:
%s\n",otherChar);
fprintf(fp1,"非法标识符:
\t\t%s\n",otherChar);
}
returnch;
}
intmain()
{
charstr;
printf("词法分析结果如下:
\n\n");
if((fp=fopen("PL源程序.txt","r"))==NULL)
{
printf("cannotopenthefile!
\n");
exit(0);
}
else
{
str=fgetc(fp);
while(str!
=EOF)
{
if(isalpha(str)!
=0)
{
str=LetterProcess(str);
}
elseif(isdigit(str)!
=0)
{
str=NumberProcess(str);
}
else
str=OtherProcess(str);
}
printf("词法分析结束\n");
printf("词法分析结果已写入文件\n");
}
fclose(fp);
fclose(fp1);
getchar();
return0;
}
4.实验结果
5.实验总结分析
通过这次实验是我对程序编译这块有了基本的了解,体会到了程序内部编译时的原理及运行过程,清楚了在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法,也认识到了语言设计的一些基本知识,同时也使我复习了以前的c++编程知识,感觉收获很大
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告 模版