词法分析器实验报告.doc
- 文档编号:2123394
- 上传时间:2023-05-02
- 格式:DOC
- 页数:9
- 大小:206KB
词法分析器实验报告.doc
《词法分析器实验报告.doc》由会员分享,可在线阅读,更多相关《词法分析器实验报告.doc(9页珍藏版)》请在冰点文库上搜索。
杭州电子科技大学班级:
12052312专业:
计算机科学与技术
实验报告
【实验名称】实验一词法分析实验
一、实验目的
设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
二、实验内容
2.1待分析的简单词法
(1)关键字:
所有的关键字都是小写
beginifthenwhiledoend
(2)运算符和界符
:
=+-*/<<=<>>>==;()$
(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:
ID=letter(letter|digit)*
NUM=digitdigit*
(4)空格有空白、制表符和换行符组成。
空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。
2.2各种单词符号对应的编码(类别):
表1各种单词符号对应的编码
单词符号
编码
单词符号
编码
begin
1
:
=
17
if
2
<
18
then
3
<>
20
while
4
<=
21
do
5
>
22
end
6
>=
23
Letter(letter|digit)*
10
=
24
digitdigit*
11
;
25
+
13
(
26
-
14
)
27
*
15
$
0
/
16
2.3词法分析程序的功能:
输入:
所给文法的源程序字符串。
输出:
二元组(编码,值)构成的序列。
其中:
syn为单词种别码;
token为存放的单词自身字符串;
num为整型常数。
例如:
对源程序beginx:
=9;ifx>9thenx:
=2*x+1/3;end$的源文件,经过词法分析后输出如下序列:
(1,begin)(10,x)(17,:
=)(11,9)(25,;)(2,if)……
三、算法思想框图
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
在这里用”#”代替”$”。
四、实验要求
1.写出程序框图、自动机。
2.写出程序源代码,并调试通过,输出实验结果。
3.完成实验报告及总结。
五、个人心得
通过该实验,主要有以下几方面收获:
一、对实验原理有更深的理解。
二、对词法分析在实践中的应用有深刻的理解。
在实践的基础上,把所学过的知识应用于实际应用,更深刻的理解了词法分析以及编译原理的实际应用。
三、通过本次编译原理课程设计,激发了我学习的积极性,培养了我独立发现问题、分析问题,解决问题的能力。
更增强我与同学交流沟通和共同解决问题合作的能力。
四、验收时有少许错误,问题在于最后输出结果是时候,是输入相同大小的字符数组,导致出现空格。
六、代码与运行结果
(1)源代码
#include
#include
#include
charprog[80],token[8];
charch;
intsyn,p,i,n,row,num=0;
char*s[6]={"begin","if","then","while","do","end"};
voidscaner()
{
for(n=0;n<8;n++)
token[n]='';
ch=prog[p++];
while(ch=='')
{
ch=prog[p];
p++;
}
//判断是标示符或者变量名
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//可能是标示符或者变量名
{
i=0;
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
token[i++]=ch;
ch=prog[p++];
}
token[i++]='\0';
p--;
syn=10;
for(n=0;n<6;n++)//将识别出来的字符和已定义的标示符作比较,
if(strcmp(token,s[n])==0)
{
syn=n+1;
break;
}
}
//数字
elseif((ch>='0'&&ch<='9'))
{
{
num=0;
while((ch>='0'&&ch<='9'))
{
num=num*10+ch-'0';
ch=prog[p++];
}
}
p--;
syn=11;
if(num>32767)
syn=-1;
}
//判断运算符或者分界符
elseswitch(ch)
{
case'<':
i=0;token[i++]=ch;
ch=prog[p++];
if(ch=='>')
{
syn=20;
token[i++]=ch;
}
elseif(ch=='=')
{
syn=21;
token[i++]=ch;
}
else
{
syn=18;
p--;
}
break;
case'>':
i=0;token[i++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=23;
token[i++]=ch;
}
else
{
syn=22;
p--;
}
break;
case':
':
i=0;token[i++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=17;
token[i++]=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=24;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=0;token[0]=ch;break;
case'\n':
syn=-2;break;
default:
syn=-1;break;
}
}
intmain()
{
p=0;
row=1;
printf("Pleaseinputstring:
\n");
do
{
ch=getchar();
prog[p++]=ch;
}
while(ch!
='#');
if(prog[0]>='0'&&prog[0]<='9'&&((prog[1]>='a'&&prog[1]<='z')||(prog[1]<='A'&&prog[1]<='Z')))
{
printf("Error!
\n");
}
else{
p=0;
do
{
scaner();
switch(syn)
{
case11:
cout<<"("< case-1: cout<<"Errorinrow"< "< case-2: row=row++;break; default: cout<<"("< } } while(syn! =0); } } (2)运行结果 1. 2. 8
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析器 实验 报告