词法分析程序实验报告

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

词法分析程序实验报告

一、实验目的

1. 理解词法分析器的基本功能

2. 理解词法规则的描述方法

3. 理解状态转换图及其实现

4. 能够编写简单的词法分析器

二、实验要求

2、主程序流程图

三、识别单词的状态转换图Scanner()函数流程图

2. 分析直接转向法和表驱动法的优缺点

状态转换图的实现通常有两种方法:状态转换表和直接转向法(1) :状态转换表法又称数据中心,是把状态转换图看作一种数据结构,由控制程序控制字符在其上运行,从而完成词法分析。优点是程序短,但是占存储空间多,

(2)直接转向法又称程序中心法,是把状态转换图看成一个流程图,从状态转换图的初态开始,对它的每一个状态节点都编写一段相应的程序。

源程序如下

#include

#include

char ch;//扫描哪一个字符

char stoken[100];//扫描到的单词序列

char token[10];//存储已扫描到的单词

int p,m,n;

int state;//词法分析时进入哪一个状态

int row;//用于标注哪一行不能识别

long int num;

char

*key[8]={"function","if","else","for","then","while","do","endfunction"};//定义好的能识别的关键字

void scanner()

{

for(n=0;n<10;n++) //变量初始化

token[n]=NULL;

m=0;

ch=stoken[p];

p++;

while(ch == ' '||ch == '\n')//跳过空格或是换行符

{

ch=stoken[p];

p++;

}

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

{

m = 0;

while(ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z')

{

token[m++] = ch;

ch = stoken[p++];//扫描下一个

}

ch = stoken[--p];

state = 10;

for(n = 0; n < 8; n++)

if(strcmp(token, key[n])== 0)

{

state = n + 1;

break;

}

}

else

if(ch >= '0' && ch <= '9')//是数字

{

num = 0;

while(ch >= '0' && ch <= '9')//可能是多位数字

{

num = num * 10 + ch - '0';

ch =stoken[p++];

}

ch = stoken[--p];

state = 11;

}

else

switch(ch)

{

case '<':

m = 0;

token[m++] = ch;

ch = stoken[p++];

if(ch == '=')

{

state = 21;

token[m++] = ch;

}

else

{

state = 20;

ch = stoken[--p];

}

break;

case '>':

m = 0;

token[m++] = ch;

ch = stoken[p++];

if(ch == '=')

{

state = 24;

token[m++] = ch;

}

else

{

state = 23;

ch = stoken[--p];

}

break;

case'=':

m=0;

token[m++]=ch;

ch = stoken[p++];

if(ch=='=')

{

state = 25;

token[m++]=ch;

}

else

{

state=18;

ch = stoken[--p];

}

break;

case'!':

m=0;

token[m++]=ch;

ch = stoken[p++];

if(ch == '=')

{

state=22;

token[m++]=ch;

}

else

{

state = -1;

}

break;

case'+':

state=13;

token[0]=ch;

break;

case'-':

state=14;

token[0]=ch;

break;

case'*':

state=15;

token[0]=ch;

break;

case'/':

state=16;

token[0]=ch;

break;

case';':

state=26;

token[0]=ch;

break;

case'(':

state=27;

token[0]=ch;

break;

case')':

state=28;

token[0]=ch;

break;

case'{':

state=29;

token[0]=ch;

break;

case'}':

state=30;

token[0]=ch;

break;

case '#':

相关文档
最新文档