编译原理词法分析器的构造.docx
- 文档编号:5597038
- 上传时间:2022-12-28
- 格式:DOCX
- 页数:12
- 大小:90.71KB
编译原理词法分析器的构造.docx
《编译原理词法分析器的构造.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析器的构造.docx(12页珍藏版)》请在冰豆网上搜索。
编译原理词法分析器的构造
实验报告
(2014/2015学年第一学期)
课程名称
编译原理
实验名称
词法分析器的构造
实验时间
2015
年
4
月
10
日
指导单位
南京邮电大学
指导教师
蒋凌云
学生姓名
孙雪禄
班级学号
B12041213
学院(系)
计算机学院、软件学院
专业
软件工程(服务外包)
实验报告
实验名称
词法分析器的构造
指导教师
蒋凌云
实验类型
上机实验
实验学时
4
实验时间
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,’;’)
(2,’a’)
(4,’=’)
(3,’10’)
(5,’;’)
(2,’b’)
(4,’=’)
(2,’a’)
(4,’+’)
(3,’20’)
(5,’;’)
(5,’}’)
2、实验要求:
(1)、允许用户自己输入源程序并保存为文件
(2)、系统能够输出经过预处理后的源程序(去掉注释、换行、空格等)
(3)、能够将该源程序中所有的单词根据其所属类型(整数、保留字、运算符、标识符等。
定义的类C语言中的标识符只能以字母或下划线开头)进行归类显示,例如:
识别保留字:
if、int、for、while、do、return、break、continue等,其他的都识别为标识符;常数为无符号整形数;运算符包括:
+、-、*、/、=、>、<、>=、<=、!
=等;分隔符包括:
、;、{、}、(、)等。
(4)、实现文件的读取操作,而不是将文本以字符串形式预存于程序中。
文本内容为待分析的类C语言程序。
3、实验过程描述
(1)首先讲和书上一样分成5类
分类号
分类内容
1
保留字
2
标识符
3
整数
4
运算符(+,-,*,/,>,<,=等)
5
分隔符(,,;,{,},(,))
(2)、接着写出用到的简单文法并转换成状态转换图
<标识符>:
:
=字母|字母<标识符>|<标识符>数字
<整数>:
:
=数字|数字<整数>
<运算符>:
:
=+|-|*|<|>|=
<分隔符>:
:
=,|;|(|)|{|}
保留字是一种特殊的标识符,不独立写出其文法
状态转换图如下:
(3)按照书上的步骤写程序
因为程序要求将用户的输入保存到文件中所以这里要用到文件存贮操作,fopen(FILE*文件名,打开方式)。
一共有三个函数分别是
boolLETTER(charA)//判断字符是否是字母
{
if(A>='a'&&A<='z')
returntrue;
elseif(A>='A'&&A<='Z')
returntrue;
elsereturnfalse;
}
boolDIGIT(charA)//判断字符是否是数字
{
if(A>='0'&&A<='9')
returntrue;
else
returnfalse;
}
boolREAERVE(char*a)//判断标识符是否为保留字
{
if(strcmp(a,"if")==0)
{cout<<"(1,'"< if(strcmp(a,"int")==0) {cout<<"(1,'"< if(strcmp(a,"for")==0) {cout<<"(1,'"< if(strcmp(a,"while")==0) {cout<<"(1,'"< if(strcmp(a,"do")==0) {cout<<"(1,'"< if(strcmp(a,"return")==0) {cout<<"(1,'"< if(strcmp(a,"break")==0) {cout<<"(1,'"< if(strcmp(a,"continue")==0) {cout<<"(1,'"< if(strcmp(a,"main")==0) {cout<<"(1,'"< returnfalse; } 下面附上全部的代码: #include #include #include usingnamespacestd; boolLETTER(charA) { if(A>='a'&&A<='z') returntrue; elseif(A>='A'&&A<='Z') returntrue; elsereturnfalse; } boolDIGIT(charA) { if(A>='0'&&A<='9') returntrue; else returnfalse; } boolREAERVE(char*a) { if(strcmp(a,"if")==0) {cout<<"(1,'"< if(strcmp(a,"int")==0) {cout<<"(1,'"< if(strcmp(a,"for")==0) {cout<<"(1,'"< if(strcmp(a,"while")==0) {cout<<"(1,'"< if(strcmp(a,"do")==0) {cout<<"(1,'"< if(strcmp(a,"return")==0) {cout<<"(1,'"< if(strcmp(a,"break")==0) {cout<<"(1,'"< if(strcmp(a,"continue")==0) {cout<<"(1,'"< if(strcmp(a,"main")==0)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 词法 分析器 构造