编译原理课程设计c++ 版Word格式.docx
《编译原理课程设计c++ 版Word格式.docx》由会员分享,可在线阅读,更多相关《编译原理课程设计c++ 版Word格式.docx(10页珍藏版)》请在冰点文库上搜索。
完成下述文法所描述的单词符号的词法分析程序:
<
标识符>
-->
字母>
|<
数字>
无符号整数>
分界符>
+|-|*|/|;
|(|)|{|}|<
=|=|!
=|>
|:
=|<
空格>
a|…|z|A|…|Z
0|…|9
’’
三.问题分析及相关原理介绍
3.1编译系统原理介绍
编译原理是介绍如何将高级程序设计语言变换成计算机硬件所能识别的机器语言,以便计算机进行处理。
它的理论基础坚实,其系统不仅应用于编译技术,还大量应用于人工智能、多媒体技术及数据库等领域。
3.2算法及功能分析
1.Main函数为主函数,在程序开始定义了Iskey,IsLetter,IsDigit几个函数然后把把字符串ch赋值为空,主函数mian.子函数是用来判断是否是关键字,字母和数字。
主函数还有switch语句来进行对运算符,单分界符,双分界符和控制。
2.首先运行主函数,并判断输入文件的路径正确与否。
输入正确后,开始调用函数进行分析。
3.判断是否是为空格,制表符,回车。
是则输出空。
否则继续向下执行。
4.判断是否为字母,若是大写字母的话ch=ch+32,将字母变成小写。
5.调用函数判断该字符串是否为关键字。
是关键字输出字符串及关键字,不是关键字则输出字符,并说明是普通标识符。
6.下面是匹配数字和运算符,并输出结果,其中运算符用switch语句进行判断。
结构图如下:
四设计思路及关键问题的解决方法
1.设计思路
通过主函数,并通过调用子函数,让子函数各司其职通过主函数的调用提高程序运行的效率。
首先判断文件是否存在,是否为空,接着打开输入文件,逐个字符地读入要分析的程序。
对读入的字符串进行分类,分为数字、字符串和其它,然后依次循环分别对数字串、字符串和其他情况进行判断处理,同时将结果输出界面显示。
其中字符串的判断分为标识符和关键字,其它情况的判断分为单分界符、双分界符。
对关键字的存储问题中中用到了指针数组,使字符串的处理更加灵活方便。
2.本词法分析器设计时的难点
首先是指针的用法,通过使用fseek函数,可以重定位流上的文件指针,轻易把文件指针返回上一个字符
第二是单目运算符和双目运算符的引用,开始不知道该如何去做,后来通过switch语句来解决这一难题。
5.结果及测试分析
1.程序运行后输入源文件名和路径名。
2.程序编译器输出结果。
七、总结心得与体会
这次课程设计是用C++编写该程序编写程序,通过这次写程序,了解了词法分析程序的开发过程及程序的运行,掌握了词法分析的一些基本理念,同时也感到自己的知识水平有限,写的这个词法分析程序功能有限在很多方面的功能还有待完善,在这次试验中有几点体会。
1.由于对C语言不太熟悉,所以采用的较为熟悉的C++作为设计语言。
刚开始的时候认为这是个很简单的程序,但一做下来发现,有很多地方不知道该怎么实现,特别是指针部分,以及对程序的整结构方面的不能实现功能,等到后来看了好几遍书之后,捋清思路后才实现功能。
2.写程序前(无论大小)最好先把程序流程写下来,这样一来,有了明确的思路,即使错了也能很好的找出错误,完成程序。
在今后的学习中,要注意实践,不能眼高手低,多做试验才能更好的理解理论,并且要多问几个问什么,把知识学到家。
八、附录(程序源代码:
)
#include<
iostream>
string>
usingnamespacestd;
//申请空间缓存
#definea22
charch='
'
;
//CH字符类型空值
stringkey[15]={"
begin"
"
end"
if"
then"
else"
while"
write"
read"
"
do"
"
call"
const"
char"
until"
procedure"
repeat"
};
//定义关键字数组
intIskey(stringc)//类型符//关键字判断定义函数
{
inti;
for(i=0;
i<
a;
i++)
{
if(key[i].compare(c)==0)return1;
//A
}
return0;
}
intIsLetter(charc){//判断是否为字母
if(((c<
='
z'
)&
&
(c>
a'
))||((c<
Z'
A'
)))return1;
elsereturn0;
intIsDigit(charc){//判断是否为数字
if(c>
0'
c<
9'
)return1;
voidanalyse(FILE*fpin)//文件名括号文件指针
{
stringarr="
//定义字符串
while((ch=fgetc(fpin))!
=EOF){//EOF表结束表文件不结束
arr="
if(ch=='
||ch=='
\t'
\n'
){}
elseif(IsLetter(ch)){
while(IsLetter(ch)||IsDigit(ch)){
if((ch<
(ch>
))ch=ch+32;
//大字母CH加32
arr=arr+ch;
ch=fgetc(fpin);
//指针下移一位并赋值CH
}
fseek(fpin,-1L,SEEK_CUR);
//指针后移一位
if(Iskey(arr)){cout<
arr<
关键字"
endl;
}//A//判断关键字
elsecout<
普通标识符"
elseif(IsDigit(ch)){
while(IsDigit(ch)||ch=='
.'
IsDigit(fgetc(fpin))){
cout<
无符号实数"
elseswitch(ch){
case'
+'
:
-'
:
*'
/'
cout<
ch<
运算符"
break;
('
)'
['
]'
'
'
{'
}'
界符"
{ch=fgetc(fpin);
//获取字母刀CH
)cout<
="
else{cout<
}
}break;
case'
>
)cout<
输入控制符"
//通过指针实现>
=功能
elseif(ch=='
输出控制符"
else{cout<
default:
无法识别字符"
voidmain(){
charin_fn[30];
//定义字符串保存路径名
FILE*fpin;
//文件指针
请输入路径名和源文件名:
for(;
cin>
in_fn;
//输入路径名
if((fpin=fopen(in_fn,"
r"
))!
=NULL)break;
文件路径错误!
\n分析如下:
analyse(fpin);
//调用
fclose(fpin);
参考文献
[1]陈意云.编译原理和技术[M].2版.合肥:
中国科学技术大学出版社,1997.
[2]谭浩强c++程序设计北京清华大学出版社2003
[3]张国峰.C++语言及其程序设计教程.北京:
电子工业出版社,1992.