词法分析程序实验报告.docx
- 文档编号:7324728
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:12
- 大小:103.21KB
词法分析程序实验报告.docx
《词法分析程序实验报告.docx》由会员分享,可在线阅读,更多相关《词法分析程序实验报告.docx(12页珍藏版)》请在冰点文库上搜索。
词法分析程序实验报告
词法分析程序实验报告
报告人:
周聪200825501240
小组成员:
杨青青200825501247
杨志超200825501236
曹亚培200825501239
一、实验目的
1.理解词法分析器的基本功能
2.理解词法规则的描述方法
3.理解状态转换图及其实现
4.能够编写简单的词法分析器
二、实验要求
给出单词序列对应的状态识别。
单词符号
State对应的值
单词符号
State对应的值
function
1
=
18
if
2
<
20
else
3
<=
21
for
4
!
=
22
then
5
>
23
while
6
>=
24
do
7
==
25
endfunction
8
;
26
letter(letter|digit)*
10
(
27
digitdigit*
11
)
28
+
13
{
29
-
14
}
30
*
15
#
0
/
16
2、主程序流程图
三、识别单词的状态转换图
Scanner()函数流程图
2.分析直接转向法和表驱动法的优缺点
状态转换图的实现通常有两种方法:
状态转换表和直接转向法
(1):
状态转换表法又称数据中心,是把状态转换图看作一种数据结构,由控制程序控制字符在其上运行,从而完成词法分析。
优点是程序短,但是占存储空间多,
(2)直接转向法又称程序中心法,是把状态转换图看成一个流程图,从状态转换图的初态开始,对它的每一个状态节点都编写一段相应的程序。
源程序如下
#include
#include
charch;//扫描哪一个字符
charstoken[100];//扫描到的单词序列
chartoken[10];//存储已扫描到的单词
intp,m,n;
intstate;//词法分析时进入哪一个状态
introw;//用于标注哪一行不能识别
longintnum;
char*key[8]={"function","if","else","for","then","while","do","endfunction"};//定义好的能识别的关键字
voidscanner()
{
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)
{
case11:
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);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析 程序 实验 报告