实验一词法分析实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一词法分析
一、实验目的
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“ Error ”,然后跳过错误部分继续显示)
二、实验要求
使用一符一种的分法
关键字、运算符和分界符可以每一个均为一种
标识符和常数仍然一类一种
三、实验内容
功能描述:
1、待分析的简单语言的词法
(1)关键字:
begin if then while do end
(2)运算符和界符:
:= + —* / < <= <> > >= = ; ( ) #
(3)其他单词是标识符(ID )和整型常数(NUM ),通过以下正规式定义
ID=letter ( letter| digit ) *
NUM=digit digit *
(4 ) 空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。
2、各种单词符号对应的种别码
程序结构描述:
是调用seanner()
.字母
拼字符串 I
数
四、实验结果
输入 beg in x:=9: if x>9 then x:=2*x+1/3; end # 序列:(begin 1)(x
10)(: 17)(=
18)(9
11)(; 26)(if
2)…… 如图 3 所示:
后经词法分析输出如下 其他
1( begin
< then
输入private x:=9;if x>0 then x:=2*x+1/3; end# 后经词法分析输出如下序
列:(private 10)(x 10)( : 17)(= 18)(9 11)(; 26)(if
2)…… 如图 4 所
示:
Pits £II put str* ■艸二
se- =9 ; If x>© then x = -2*x*丄#3 事 endlf
<1 w_
于 >
(i 叽 *>
<2t> ; > <2,ir> <20. » <3. thf^n >
<1
cia,?=> <11,2> c±a,
图4
16203130781503161
10
10 17 18
显然,private是关键字,却被识别成了标示符,这是因为图1中没有定义
private关键字的种别码,所以把private当成了标示符。
输入private x:=9;if x>0 then x:=2*x+1/3; @ end#
后经词法分析输出如下序列:(private 10)(x 10)( : 17)(= 18)(9 11)(; 26)(if 2)…… 如图 5
所示
显然,@没有在图一中定义种别,所以输出了“ Error in row 1! ”的报错信息。
五、词法分析程序的C语言程序源代码
void scaner()
{
/*
共分为三大块,分别是标示符、数字、符号,对应下面的if else if 和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 ;
}
}
else if ((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;
}
else switch (ch) // 其他字符
{
case '<' :m= 0;token[m++]=ch; ch=prog[p++]; if (ch== '>' ) {
syn= 21; token[m++]=ch;
}
else if (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--;