词法分析报告.docx
- 文档编号:2163922
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:17
- 大小:19.42KB
词法分析报告.docx
《词法分析报告.docx》由会员分享,可在线阅读,更多相关《词法分析报告.docx(17页珍藏版)》请在冰豆网上搜索。
词法分析报告
编译原理实验报告
实验一词法分析程序的设计与实现
指导教师:
姓名:
学号:
班级:
一、实验目的
基本掌握计算机语言的词法分析程序的开发方法。
二、实验内容
编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。
三、实验要求
1.根据以下的正规式,编制正规文法,画出状态图;
标识符<字母>(<字母>|<数字字符>)*
十进制整数0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*
八进制整数0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*
十六进制整数0(x|X)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*
运算符和分隔符+-*/><=();
关键字ifthenelsewhiledo
2.根据状态图,设计词法分析函数intscan(),完成以下功能:
(1)从输入流(键盘或文件)读入数据,分析出一个单词。
(2)返回单词种别(用整数表示),
(3)返回单词属性(不同的属性可以放在不同的全局变量中)。
3.编写测试程序,循环调用函数scan(),每次调用,获得一个单词的信息。
在测试程序中,打印输出单词种别、属性(注意:
不要在词法分析函数
scan中打印输出!
)。
四、实验环境
微型计算机。
Windows操作系统/Linux操作系统。
编程语言:
C/C++/Java/C#。
建议使用VisualC++/Netbeans/Eclipse集成开发环境。
五、实验步骤
1.根据状态图,设计词法分析算法
2.设计函数scan(),实现该算法
3.编制测试程序(在本试验中,可以是主函数main())。
4.调试程序:
输入一组单词,检查输出结果。
六、状态图
七.测试数据:
092+data>0x3f
00while
八.测试结果
九,思考题
1.词法分析能否采用空格来区分单词?
答:
不能,因为比如abc+bcd中没有空格,但这是三个单词。
2.程序设计中哪些环节影响词法分析的效率?
如何提高效率?
答:
整个程序都由状态转换图而来。
由递归方法实现的状态转换图,影响了整个词法分析器的分析效率,可以考虑使用栈来非递归的实现词法分析。
十.实验心得
通过词法分析程序的实现,我理解了计算机是怎么去识别一个个单词的,或者可以说是各种命令的。
这次实验使我对c语言中文件操作更加了解,了解文件指针的运行情况,还了解了编译原理中有限自动机的概念,根据状态图写程序。
十一.源代码
#include
usingnamespacestd;
#include
#defineASG1
#defineADD2
#defineSUB3
#defineMUL4
#defineDIV5
#defineID6
#defineIF7
#defineTHEN8
#defineWHILE9
#defineDO10
#defineINT811//八进制
#defineINT1012//十进制
#defineINT1613
#defineSLP14//左括号(
#defineSRP15//右括号)
#defineSEMI16//分号;
#defineLP17//左花括号{
#defineRP18//右花括号}
#defineINC19//++
#defineDECC20//--
#defineNEQ21//不等于
#defineEQ22//等于
#defineJAE23//大于等于
#defineJA24//大于
#defineJBE25//小于等于
#defineJB26//小于
structword
{
intkind;
intvalue;
};
intfpoint;//文件字符指针
intnum_token;//一个单词中的字符数量,主要是数字长度
char*token;
fstreamfile;//所要读取的文件
wordhandle_identifier(char*ch)//处理标识符(包括关键字)
{
structwordre;//返回值
//////////////////////////关键字///////////////////////////
if(strcmp(ch,"if")==0)
{
re.kind=IF;
re.value=0;
returnre;
}
if(strcmp(ch,"then")==0)
{
re.kind=THEN;
re.value=0;
returnre;
}
if(strcmp(ch,"while")==0)
{
re.kind=WHILE;
re.value=0;
returnre;
}
if(strcmp(ch,"do")==0)
{
re.kind=DO;
re.value=0;
returnre;
}
//////////////////////////标识符///////////////////////////
re.kind=ID;
re.value=0;
returnre;
}
intconvert(charch)//将字符转换成数字
{
intnumber;
switch(ch)
{
case'0':
number=0;break;
case'1':
number=1;break;
case'2':
number=2;break;
case'3':
number=3;break;
case'4':
number=4;break;
case'5':
number=5;break;
case'6':
number=6;break;
case'7':
number=7;break;
case'8':
number=8;break;
case'9':
number=9;break;
case'A':
number=10;break;
case'a':
number=10;break;
case'B':
number=11;break;
case'b':
number=11;break;
case'C':
number=12;break;
case'c':
number=12;break;
case'D':
number=13;break;
case'd':
number=13;break;
case'E':
number=14;break;
case'e':
number=14;break;
case'F':
number=15;break;
case'f':
number=15;break;
default:
number=-1;break;//非法字符转换成-1
}
returnnumber;
}
wordhandle_number(char*ch,intTN)//处理无符号整数
{
inti,j;
intnumber;//对应每一位上转换后的数字
intdec=0,oct=0,hex=0;//最终的数值,三种进制
wordre;//返回值
if(TN==1)//一位数,只能是十进制
{
number=convert(ch[0]);
if(number==-1||number>9)cout<<"Error!
";
else
{
re.kind=INT10;
re.value=number;
returnre;
}
}
if((TN==2)&&(ch[0]=='0'))//两位数,八进制
{
number=convert(ch[1]);
if((number>=0)&&(number<=7))
{
re.kind=INT8;
re.value=number;
returnre;
}
elsecout<<"Error!
八进制非法";//报错
}
if((TN>=2)&&(ch[0]!
='0'))//两位位数(含)以上,十进制
{
int*num=newint[TN];
for(i=0;i { number=convert(ch[i]); num[i]=number; if((number==-1)||(number>9))cout<<"Error! 十进制非法";//报错 } for(i=0;i { for(j=TN-i-1;j>0;j--) num[i]*=10; dec+=num[i]; } re.kind=INT10; re.value=dec; returnre; } elseif((TN>=3)&&(ch[0]=='0')&&(ch[1]! ='x')&&(ch[1]! ='X'))//三位数(含)以上,八进制 { int*num=newint[TN-1]; for(i=1;i { number=convert(ch[i]); num[i]=number; if((number==-1)||(number>7))cout<<"Error! 八进制非法";//报错 } for(i=1;i { for(j=TN-i-1;j>0;j--) num[i]*=8; oct+=num[i]; } re.kind=INT8; re.value=oct; returnre; } elseif((TN>=3)&&(ch[0]=='0')&&((ch[1]=='x')||(ch[1]=='X')))//三位数(含)以上,十六进制 { int*num=newint[TN-2]; for(i=2;i { number=convert(ch[i]); num[i]=number; if(number==-1)cout<<"Error! 十六进制非法";//报错 } for(i=2;i { for(j=TN-i-1;j>0;j--) num[i]*=16; hex+=num[i]; } re.kind=INT16; re.value=hex; returnre; } } wordscan(charch
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析 报告