编译原理词法分析器的构造

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实 验 报 告

(2014 / 2015 学年 第 一 学期)

课程名称

编译原理 实验名称 词法分析器的构造

实验时间

2015 年 4 月 10 日 指导单位

南京邮电大学 指导教师

蒋凌云 实

验 报 告 实验名称 词法分析器的构造 指导教师

蒋凌云 实验类型 上机实验 实验学时 4 实验时间 2015.4.10

学生姓名

孙雪禄 班级学号 B12041213 学院(系) 计算机学院、软件学院 专 业 软件工程(服务

外包)

一、实验目的和要求

设计、编制、调试一个词法分析程序,对单词进行识别和编码,加深对词法分析原理的理解。

二、实验环境(实验设备)

Microsoft Visual Stdio 2010

二、实验原理及内容

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 *文件名,打开方式)。一共有三个函数分别是

bool LETTER(char A) //判断字符是否是字母

{

if (A>='a'&&A<='z')

return true ;

else if (A>='A'&&A<='Z')

return true ;

else return false ; }

bool DIGIT (char A) //判断字符是否是数字 {

if (A>='0'&&A<='9')

return true ;

else

return false ; }

bool REAERVE(char *a) //判断标识符是否为保留字 0 ⑤ ⑥

3 1 ②

④ 字母 非数字或字母 字母或数字

数字 数字 非数字 +-*/=>< , ; ( ) { }

{

if(strcmp(a,"if")==0)

{cout<<"(1,'"<

{cout<<"(1,'"<

{cout<<"(1,'"<

{cout<<"(1,'"<

{cout<<"(1,'"<

{cout<<"(1,'"<

{cout<<"(1,'"<

{cout<<"(1,'"<

{cout<<"(1,'"<

}

下面附上全部的代码:

#include

#include

#include

using namespace std;

bool LETTER(char A)

{

if(A>='a'&&A<='z')

return true;

else if(A>='A'&&A<='Z')

return true;

else return false;

}

bool DIGIT (char A)

{

if(A>='0'&&A<='9')

return true;

else

return false;

}

bool REAERVE(char *a)

{

相关文档
最新文档