编译原理课程设计词法分析器设计Word格式.docx
《编译原理课程设计词法分析器设计Word格式.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计词法分析器设计Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
在文本文档中输出每个单词对应的编码和值。
2、编译对象
声明和其他标记
赋值语句
分支结构语句
循环语句
1.4设计时间
2012年12月23日至2012年12月28日
2设计环境与工具
Windows7环境下使用C++语言。
3设计要求
1、使用任何一种编程语言编制一个词法分析程序。
2、该程序能够识别的单词有5类:
(1)关键字:
"
long"
"
float"
static"
char"
short"
switch"
int"
const"
if"
then"
else"
for"
while"
break"
。
(2)常数:
任何整型常数
(3)标识符:
字母打头的字母数字串。
<
标识符>
→<
<
字母>
数字>
(4)运算符:
算术运算符+,-,*,/
关系运算符>
>
=,<
<
=,=,<
>
(5)界符:
(,),”,!
,;
3、源程序放在的文本文档中。
4、产生下面9个单词:
(1)a标识符
(2)=赋值(3)(左括号(4)b标识符
(5)+加号(6)c标识符(7))右括号(8)*乘号(9)3常数
4分析与概要设计
在词法分析程序设计中,以只读方式读取一个文件,文件内容的末尾以“#”作为结束符。
系统将读取的字符自动送入缓冲区。
扫描第一个字符,看匹配的类型,并进行相应的类型分析,满足判断类型时,输出其种别码和值。
运用指针进行处理,必须熟悉字符串函数的使用。
程序要对非法的字符做出错误提示。
文本扫描看结尾是否是“#”。
最后关闭文件,释放指针。
5算法流程图
6源程序清单
#include<
iostream>
string>
fstream>
usingnamespacestd;
charch;
//当前从文件中读取的字符
charTake[20];
//存放Take
intk;
//当前Take中的第K个字符
ifstreamfin;
ofstreamfout("
output.txt"
);
char*Keywords[]={"
"
};
//保留字
intlpos=1;
//列号
voidgetChar()//读入文件的下一个字符
{
lpos++;
ch=fin.get();
}
boolisInteger()
if(ch>
='
0'
&
ch<
9'
)
returntrue;
else
returnfalse;
boolisLetter()
if(((ch>
a'
)&
(ch<
z'
))||(ch>
A'
Z'
))
voidcontact()//将文件中读入的字符加入Take数组的最后
Take[k]=ch;
k++;
boolisKeyword()//判断Take是否为保留字
for(inti=0;
i<
14;
i++)
{
if(strcmp(Keywords[i],Take)==0)
returntrue;
else
returnfalse;
}
voidclear()
20;
Take[i]='
\0'
;
k=0;
voidyyLex()
switch(ch)
case'
:
1'
2'
3'
4'
5'
6'
7'
8'
contact();
getChar();
{
while(isInteger())
{
contact();
getChar();
}
fout<
常数"
'
\t'
Take<
endl;
}
clear();
yyLex();
break;
case'
b'
c'
d'
e'
f'
g'
h'
i'
j'
k'
l'
m'
n'
u'
o'
p'
q'
r'
s'
t'
y'
v'
w'
x'
B'
C'
D'
E'
F'
G'
H'
I'
J'
K'
L'
M'
N'
O'
P'
Q'
R'
S'
T'
U'
V'
W'
X'
Y'
while(isLetter()||isInteger())
contact();
getChar();
if(isKeyword())
关键字"
clear();
yyLex();
else
标识符"
('
)'
'
!
fout<
界符"
+'
-'
*'
/'
算术运算符"
if(ch=='
关系运算符"
clear();
intmain()
fin.open("
input.txt"
while(!
fin.eof())
if(ch!
||ch!
#'
yyLex();
getChar();
fout.close();
return0;
7软件测试
7.1设计的测试题目
a=(b+c)*3
7.2测试结果截图
8总结
本次设计达到了预先的实验目的,基于C++语言小型编译器是对本学科的一次综合性的检验,是一次理论与实践相结合的实践。
我在整个程序的编写过程中,巩固了书本上的理论知识,并且加深了词法分析器的原理。
同时也遇到了很多的困难,比如C++语言有所欠缺,编译方法的原理还有待弥补与继续学习。
由于时间仓促和自己所掌握知识不完善,此设计只是实现了简单的词法分析。
对C++字符串函数不是很熟悉。
程序中可能会出现这一类情况,如:
读入的词语为:
a=(b+c)#*3#。
本设计对在词语中间出现的“#”没有能很好的处理。
希望能在接下来的时间里,能把这个问题解决掉。
借此机会,我要特别感谢我的指导老师董改芳,在我的课程设计和此门课程的学习中给予我的悉心指导和帮助。
老师的一丝不苟的工作和对教学的认真态度深深感染了我。
最后,向支持和帮助过我的老师和同学表示我深深的谢意。
9参考文献
[1]劳顿(Louden,K.C).编译原理及实践.机械工业出版社.2002.3
[2]胡元义邓亚玲.编译原理实践教程.西安电子科技大学出版社.2002.
[3]柯丽芳胡元义.编译原理学习指导.西安电子科技大学出版社.2004.
[4]内蒙古农业大学《编译方法课程设计》指导书。
董改芳主编