编译原理实验报告《词法分析器的构造》
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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];