实验一词法分析器实验报告示例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档