实验一词法分析器实验报告示例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
词法分析器实验报告
一.需求分析
1.C语言关键字的子集,以文件形式保存,待判断的C语言语句以文件形式保存。
2.关键字文件包括标识符、基本字、常数、运算符和界符以及相应的种别码。
3.在计算机终端顺次输出各词法单位的种别码和值。若为标识符,其值为该标识符在
标识符表中的位置;若为常数,其值为该常数在常数表中的位置;其余值为-1。
非法输入单词的种别码为-1,值为-2。
4.“单词”定义:C语言中最小的语法单位。
“标识符”定义:用户自定义的标志符。
5.测试数据:文本文件为unknowedword.text
二.概要设计
1.单词种别码设计如表一所示:
A标识符及关键字如图一所示:
图一.标识符状态转换图
B实数如图二所示:
图二.实数状态转换图
C
图三.运算符状态转换图
D其它与运算符雷同,此处略
3. 数据结构
know[N] 用来存放构成单词符号的字符串;
unknow[N]用来存放待辨别的字符串;
chartab[T][N] 用来存放识别出的标识符;
keytab[M][N] 用来存放从文件中读入的基本字;
consttab[T] 用来存放识别出的实数。
以上均设为全局变量。
4.基本操作
Getchar()
初始条件:unknow中读入了一串待辨别的字符串。
操作结果:从unknow读入一个字符到ch中,指向unknow的指针加1。
Getbc()
初始条件:unknow中读入了一串待辨别的字符串。
操作结果:从unknow中读入不是空格的下一个字符。
Concat()
初始条件:know中为字母且ch中为字母,或know中为数字(包括小数点)ch中也为数字。
操作结果:将ch中的字符连接到know中。
Isletter()
初始条件:ch中已经读入了一个新的字符。
操作结果:判断ch中的字符是否字母。
Isdigit()
初始条件:ch中已经读入了一个新的字符。
操作结果:判断ch中的字符是否数字。
Keyword()
初始条件:已判断出know中的字符串为标识符。
操作结果:判断know中的字符串单词是否关键字。
Retract()
初始条件:ch中的字符不能与know中的字符串组成可识别的单词。
操作结果:将ch中的字符退回unknow中,ch为空格。
Insertchar()
初始条件:已判断出know中的字符串为非关键字的标识符。
操作结果:将know中的字符串插入到标识符表chartab中。
Insertconst()
初始条件:已判断出know中的字符串为实数。
操作结果:将know中的字符串插入到实数表consttab中。
Aword(int &code)
初始条件:ch中读入了新的字符。
操作结果:判断unknow中指针当前位置开始的单词是否标识符。
Real_number(int &code)
初始条件:ch中读入了新的字符。
操作结果:判断unknow中指针当前位置开始的单词是否实数。
5.本程序包含的模块
WordAnsis模块——实现对一个单词的识别功能。
Main 模块——调用词法分析器,分析文件unknowedword.text中所给出的程序。
6.各模块间调用关系
三.详细设计
程序源代码如下:
#include
#include
#include
#include
#define N 10
#define M 13
#define T 5
char ch,know[N],unknow[N],chartab[T][N], keytab[M][N];
float consttab[T],*pcos;
char *puk,*pk,*pch;
FILE *fkeywd,*funknw;
void Getchar()
{ch=*puk;
puk++;
}
void Getbc()
{while(ch==' ')
Getchar();
}
void Concat()
{ *pk=ch;
pk++;
}
int Isletter()
{ if(((ch>64)&&(ch<91))||((ch>96)&&(ch<123))) return 1;
else return 0;
}
int Isdigit()
{ if((ch>47)&&(ch<58)) return 1;
else return 0;
}
int Keyword()
{ int i;
for(i=0;i if(strcmp(know,keytab[i])==0) return i+1; return 14; } void Retract() { ch=' '; puk--; } int Insertchar() { strcpy(pch,know); pch+=N; return (pch-chartab[0])/N; } int Insertconst() { int i,t,t1=-1,t2=-1,t3=-1; float num=(float)0.0,para=(float)0.1,temp=(float)0.0; for(i=0;i { if(know[i]=='.') t1=i; else if((know[i]=='e')||(know[i]=='E')) t2=i; else if(know[i]=='\0') { t3=i;break;} } if(t1!=-1) i=t1; else if(t2!=-1) i=t2; else i=t3; for(i--;i>=0;i--) {para*=10; num+=para*(know[i]-48); } if(t1!=-1) {if(t2==-1) t=t3; else t=t2; para=1;