编译原理词法分析器的构造文档格式.docx
《编译原理词法分析器的构造文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析器的构造文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
2015.4.10
一、实验目的和要求
设计、编制、调试一个词法分析程序,对单词进行识别和编码,加深对词法分析原理的理解。
二、实验环境(实验设备)
MicrosoftVisualStdio2010
二、
实验原理及内容
1、实验内容:
设计并实现一个词法分析器,实现对指定位置的类C语言源程序文本文件的读取,并能够对该源程序中的所有单词进行分类,指出其所属类型,实现简单的词法分析操作。
例如下面为一段C语言源程序:
main(){
int
a,b;
a=10;
b=a+20;
}
要求输出如下(可以自行分类,分类原则请在报告中说明)
(1,’main’)
(5,’(’)
(5,’)’)
(5,’{’)
(1,’int’)
(2,’a’)
(5,’,’)
(2,’b’)
(5,’;
’)
(4,’=’)
(3,’10’)
(4,’+’)
(3,’20’)
(5,’}’)
2、实验要求:
(1)、允许用户自己输入源程序并保存为文件
(2)、系统能够输出经过预处理后的源程序(去掉注释、换行、空格等)
(3)、能够将该源程序中所有的单词根据其所属类型(整数、保留字、运算符、标识符等。
定义的类C语言中的标识符只能以字母或下划线开头)进行归类显示,例如:
识别保留字:
if、int、for、while、do、return、break、continue等,其他的都识别为标识符;
常数为无符号整形数;
运算符包括:
+、-、*、/、=、>
、<
、>
=、<
=、!
=等;
分隔符包括:
、;
、{、}、(、)等。
(4)、实现文件的读取操作,而不是将文本以字符串形式预存于程序中。
文本内容为待分析的类C语言程序。
3、实验过程描述
(1)首先讲和书上一样分成5类
分类号
分类内容
1
保留字
2
标识符
3
整数
运算符(+,-,*,/,>
<
=等)
5
分隔符(,,;
,{,},(,))
(2)、接着写出用到的简单文法并转换成状态转换图
<
标识符>
:
=字母|字母<
|<
数字
<
整数>
=数字|数字<
运算符>
=+|-|*|<
|>
|=
分隔符>
=,|;
|(|)|{|}
保留字是一种特殊的标识符,不独立写出其文法
状态转换图如下:
(3)按照书上的步骤写程序
因为程序要求将用户的输入保存到文件中所以这里要用到文件存贮操作,fopen(FILE*文件名,打开方式)。
一共有三个函数分别是
boolLETTER(charA)//判断字符是否是字母
{
if(A>
='
a'
&
A<
z'
)
returntrue;
elseif(A>
A'
Z'
elsereturnfalse;
boolDIGIT(charA)//判断字符是否是数字
0'
9'
else
returnfalse;
boolREAERVE(char*a)//判断标识符是否为保留字
{
if(strcmp(a,"
if"
)==0)
{cout<
"
(1,'
a<
'
)"
endl;
returntrue;
int"
for"
while"
do"
return"
break"
continue"
main"
returnfalse;
下面附上全部的代码:
#include<
string.h>
iostream>
fstream>
usingnamespacestd;
boolLETTER(charA)
boolDIGIT(charA)
boolREAERVE(char*a)
boolzimu(charA)
if((A>
)||A>
intmain()
chara;
FILE*f;
charCHAR;
charTOKEN[120];
f=fopen("
code.txt"
"
w"
);
if(f==NULL)
{
cout<
con'
tcreatefile"
exit(0);
}
cout<
pleaseinputyoucode"
while((a=getchar())!
?
fputc(a,f);
fclose(f);
over"
r"
while((CHAR=fgetc(f))!
=EOF)
while(CHAR!
'
{
if(zimu(CHAR))//标括?
识?
符?
{
intk=0;
do{
TOKEN[k]=CHAR;
k++;
}while((CHAR=fgetc(f))!
=EOF&
CHAR!
zimu(CHAR));
if(DIGIT(CHAR))//处鋦理え?
是?
否?
为a包悒?
含?
数簓字?
的?
标括?
{
do{
TOKEN[k]=CHAR;
k++;
}while((CHAR=fgetc(f))!
DIGIT(CHAR));
}
TOKEN[k]='
\0'
;
if(!
(REAERVE(TOKEN)))//判D断?
所ù
得?
为a保馈?
留?
字?
cout<
(2,'
TOKEN<
}
if(DIGIT(CHAR))//整?
数簓
inti=0;
TOKEN[i]=CHAR;
i++;
TOKEN[i]='
REAERVE(TOKEN))
(3,'
if(CHAR=='
+'
||CHAR=='
-'
*'
/'
>
)//运?
算?
cout<
(4,'
CHAR<
'
('
)'
{'
}'
)//分?
隔?
(5,'
break;
}
按恪?
任?
意癮键ü
退?
出?
cin>
CHAR;
return0;
测试结果:
文件存储在code.txt文件中
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
这次实验让我们更加了解词法分析程序的原理,熟悉了书上词法分析程序构建的步骤,也强化了我们的编程能力,比如说文件读写操作。
在我的程序中,思考了很久也没能实现”<
=””>
=”和”!
=”的词法分析。
拿”>
=”举例来说,CHAR读了”>
”之后,进行判断如果是”=”就输出“(4,’>
=’)”。
但是如果接下来的字符不是”=”,就需要判断这个CHAE字符是否为字母、数字、分隔符、其他运算符,这样就会和之前的判断进入一个死循环(因为在保留字判断的时候也要多读一个字符,判断为否定后要比较这个字符是否为数字,分隔符,运算符)。
总的来说就是我不能将文件指针前移,导致这里写不出来,这是这次实验中的瑕疵。
五、指导教师评语
成绩
批阅人
日期