编译原理实验报告《词法分析器的构造》

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

《词法分析器的构造》实验报告

一、实验名称

词法分析器的构造

二、实验目的

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

三、实验内容和要求

编写一个C语言词法分析器,要求:

1、允许用户自己输入源程序并保存为文件

2、系统能够输出经过预处理后的源程序(去掉注释、换行、空格等)

3、能够将该源程序中所有的单词根据其所属类型(整数、保留字、运算符、标识符等。定义的类C语言中的标识符只能以字母或下划线开头)进行归类显示,例如:识别保留字:if、int、for、while、do、return、break、continue等,其他的都识别为标识符;常数为无符号整形数;运算符包括:+、-、*、/、=、>、<、>=、<=、!=等;分隔符包括:,、;、{、}、(、)等。

4、实现文件的读取操作,而不是将文本以字符串形式预存于程序中。文本内容为待分析的类C语言程序。

例如下面为一段C语言源程序:

main()

{

int a,b;

a = 10;

b = a + 20;

}

要求输出如下

(2,’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,’}’)

四、主要仪器设备

硬件:微型计算机。

软件: Visual C++ 6.0(也可以是其它集成开发环境)。

五、实验过程描述

1、状态转换图

2、程序主要框架

程序中编写了以下函数,各个函数实现的作用如下:

int alpha(int st)://识别保留字和标识符

int number(int st) //识别常数

int anotation(int st) //处理除号/和注释//

int other(int st) //识别运算符、分隔符、特殊字符

int choice1(int st)//读入的字符是字母返回1

int choice2(int st)//读入的字符是数字返回1

int choice(int st) //根据读入的单词的第一个字符确定调用不同函数识别单词

3、编写的源程序

#include

#include

#include

#include

using namespace std;

string

keywords[21]={"include","void","main","int","char","float","double","if","else","then","break","continue","for","d o","while","printf","scanf","begin","end","return","define"};

char rz[99999]=" ";//源程序

char pz[9999] ="";//预处理后的源程序

string id[10000];//存储标识符

int pp=0;//标识符序号

string nu[10000];//存储常数

int qq=0;//常数序号

int choice1(char a) //判断是否是字母

{

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

return 1;

else return 0;

}

int choice2(char a) //判断是否是数字

{

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

return 1;

else return 0;

}

int alpha(int st) //识别保留字(1)和标识符(2)

{

char wordbuf[20]=" ";

for( ; ; )

{

wordbuf[n]=rz[st];

st++;

n++;

if((choice2(rz[st])==1)||(choice1(rz[st])==1)||(rz[st]=='_'))//语法标识符=<标识符><字母>|<标识符><数字>|<标识符><特殊符号>

wordbuf[n]=rz[st];

else break;

}

int flag=0;

for(int k=0;k<21;k++)

{

if(strcmp(keywords[k].c_str(),wordbuf)==0) flag=1;//是保留字

}

if(flag==1) printf(" (%s,1) ",wordbuf);

else

{

int flagg=-1;

for(int t=0;t

{

if(strcmp(id[t].c_str(),wordbuf)==0)//已经出现过的标识符

{

flagg=t;

}

}

if(flagg==-1) {//新的标识符记录到id[]中

id[pp]=wordbuf;

pp++;

}

printf(" (%s,2) ",wordbuf);

}

return st;

}

int number(int st) //识别常数

{

char numbuf[20]=" ";

int n=0;

int k=0;

int flag=0;

for( ; ; )

{

numbuf[n]=rz[st];

相关文档
最新文档