实验一词法分析实验报告.doc
《实验一词法分析实验报告.doc》由会员分享,可在线阅读,更多相关《实验一词法分析实验报告.doc(6页珍藏版)》请在冰豆网上搜索。
![实验一词法分析实验报告.doc](https://file1.bdocx.com/fileroot1/2022-10/19/1cc813a0-edf2-45f2-9d4d-a0baff09b176/1cc813a0-edf2-45f2-9d4d-a0baff09b1761.gif)
实验一词法分析
一、实验目的
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。
并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
(遇到错误时可显示“Error”,然后跳过错误部分继续显示)
二、实验要求
使用一符一种的分法
关键字、运算符和分界符可以每一个均为一种
标识符和常数仍然一类一种
三、实验内容
功能描述:
1、 待分析的简单语言的词法
(1) 关键字:
begin if then while do end
(2) 运算符和界符:
:
= + – * / < <= <> > >= = ; ( ) #
(3) 其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:
ID=letter(letter|digit)*
NUM=digitdigit*
(4) 空格由空白、制表符和换行符组成。
空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。
2、 各种单词符号对应的种别码
图1
程序结构描述:
变量初始化
忽略空格
是否输入结束?
返回
是否
是调用scanner()
字母
拼字符串
数其他
运算符、符号
界符等符号
是否关键字?
返回
拼数
否
对不同符号给出相应的syn值
报错
syn=10
是
syn=1111
syn为对应关键字的单词种别码
图2
四、实验结果
输入beginx:
=9:
ifx>9thenx:
=2*x+1/3;end#后经词法分析输出如下序列:
(begin1)(x10)(:
17)(=18)(911)(;26)(if2)……如图3所示:
图3
输入privatex:
=9;ifx>0thenx:
=2*x+1/3;end#后经词法分析输出如下序列:
(private10)(x10)(:
17)(=18)(911)(;26)(if2)……如图4所示:
图4
显然,private是关键字,却被识别成了标示符,这是因为图1中没有定义private关键字的种别码,所以把private当成了标示符。
输入privatex:
=9;ifx>0thenx:
=2*x+1/3;@end#后经词法分析输出如下序列:
(private10)(x10)(:
17)(=18)(911)(;26)(if2)……如图5所示
图5
显然,@没有在图一中定义种别,所以输出了“Errorinrow1!
”的报错信息。
五、词法分析程序的C语言程序源代码
voidscaner()
{
/*
共分为三大块,分别是标示符、数字、符号,对应下面的ifelseif和else
*/
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//可能是标示符或者变量名
{
m=0;
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
token[m++]=ch;
ch=prog[p++];
}
token[m++]='\0';
p--;
syn=10;
for(n=0;n<6;n++)//将识别出来的字符和已定义的标示符作比较,
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
elseif((ch>='0'&&ch<='9'))//数字
{
{
sum=0;
while((ch>='0'&&ch<='9'))
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
}
p--;
syn=11;
if(sum>32767)
syn=-1;
}
elseswitch(ch)//其他字符
{
case'<':
m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='>')
{
syn=21;
token[m++]=ch;
}
elseif(ch=='=')
{
syn=22;
token[m++]=ch;
}
else
{
syn=23;
p--;
}
break;
case'>':
m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=24;
token[m++]=ch;
}
else
{
syn=20;
p--;
}
break;
case':
':
m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=18;
token[m++]=ch;
}
else
{
syn=17;
p--;
}
break;
case'*':
syn=13;token[0]=ch;break;
case'/':
syn=14;token[0]=ch;break;
case'+':
syn=15;token[0]=ch;break;
case'-':
syn=16;token[0]=ch;break;
case'=':
syn=25;token[0]=ch;break;
case';':
syn=26;token[0]=ch;break;
case'(':
syn=27;token[0]=ch;break;
case')':
syn=28;token[0]=ch;break;
case'#':
syn=0;token[0]=ch;break;
case'\n':
syn=-2;break;
default:
syn=-1;break;
}
}
六、实验总结
这个实验花费了一节课的时间,通过本次试验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的相关原理,。
这个程序只能识别特定的几个关键字,假如想要识别另外的关键字还要再一次修改源程序,程序的扩展性不高,还需要改进!