词法分析程序实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
词法分析程序实验报告
一、实验目的
1. 理解词法分析器的基本功能
2. 理解词法规则的描述方法
3. 理解状态转换图及其实现
4. 能够编写简单的词法分析器
二、实验要求
2、主程序流程图
三、识别单词的状态转换图Scanner()函数流程图
2. 分析直接转向法和表驱动法的优缺点
状态转换图的实现通常有两种方法:状态转换表和直接转向法(1) :状态转换表法又称数据中心,是把状态转换图看作一种数据结构,由控制程序控制字符在其上运行,从而完成词法分析。
优点是程序短,但是占存储空间多,
(2)直接转向法又称程序中心法,是把状态转换图看成一个流程图,从状态转换图的初态开始,对它的每一个状态节点都编写一段相应的程序。
源程序如下
#include<stdio.h>
#include<string.h>
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 '#':
state = 0;
token[0] = ch;
break;
default:
state=-1;
break;
}
}
main()
{
p=0;
row=1;
printf("请输入要分析的单词:\n");
while(ch!='#')
{
scanf("%c",&ch);
stoken[p++]=ch;
}
printf("词法分析如下:\n");
p=0;
do
{
scanner();
switch(state)
{
case 11:
printf("\n(%d, %d)",num,state);
break;
case -1:
printf("\n不能识别 %d",row);
break;
default:
printf("\n(%s, %d)",token,state);
break;
}
}
while(state!=0);
}。