课程设计
院 系 _________________
专 业 _________________________ 年 级 11 级 ___________________________ 学 号 ________________________ 姓 名 ____________________________
2014年05月
实验一 简单的词法分析器设计
一、设计容
熟悉并实现一个简单的词法分析器
二、设计目的
了解高级语言单词的分类,了解如何识别单词规则,掌握状态图到识别程序的编程。
源程序中,存在许多编辑用的符号,他们对程序逻辑功能无任何影响。例如:回车, 换行,多余空白符,注释行等。在词法分析之前,首先要先剔除掉这些符号,使得词法分析 更为简单。
三、实验步骤
1.
将每个单词符号进行不同类别的划分。单词符号可以划分成 5 中。 (1) 标识符:用户自己定义的名字,常量名,变量名和过程名。 (2) 常数:各种类型的常数。
(3) 保留字(关键字) :如 if 、 begin 、 then、 while 、 do 等。 (4) 运算符:如 +、-、*、<、 >、=等。 (5) 界符:如逗号、分号、括号等。 2.
将所有合法的单词符号转化为便于计算机处理的二元组形式: (单词分类号,单词自身 值);以图形化界面显示出来。
3.
可选择性地将结果保存到文件中。
四、概要设计
1.待分析的简单语言的词法
(1) 关键字: while do relop letter id number 所有关键字都是小 写。 (2) 运算符和界符:
:= + - */<<=<>>>= = ;()#
(3) 其他单词是标识符(ID)和整型常数(NUM ),通过以下正规式定义: 如课本P20例2.6
空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、
界符和关键字,词法分析阶段通常被忽略。
2.词法分析器的结构
图6.1词法分析器的结构
3 •部分单词的正规式与状态转换图
c空白数子二字母 初
态
:L:
业一 6态
卡母
4 •功能模块
表6.2 词法分析器的C#程序过程或函数功能表 过程或函数名 void sea ner() 简要功能说明 分析源程序得到单个单词并大致区分其 类型,并生成二元组 输入源程序
void mai n() 五、详细设计
1 •流程图
图7.1程序总体流程图
六、编程调试
1•源代码
#in clude\"stdio.h\" #in clude\"stri ng.h\" #i nclude\"iostream.h\"
char prog[100],toke n[20]; char ch;
int syn ,p,m=0,n, row,sum=0;
char *rwtab [ 6]={\"while\
void sca ner() {
for(n=0 ;n <8 ;n++) toke n[n ]=NULL; ch=prog[p++]; while(ch=='') {
ch=prog[p]; p++; }
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--;
}
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;
}
}
void main()
{
p=0; row=1;
cout<<\" 请输入字符串 (字符 #是字符串输入结束标志 ):\"< cin.get(ch); prog[p++]=ch; } while(ch!='#'); cout<<\" 字符串输出结果为 :\"< } while (syn!=0); 调试 七、收获(体会)与建议 通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词 法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理, 根据识别 语言单词的状态转换图,使用某种高级语言直接编写此法分析程序。 因篇幅问题不能全部显示,请点此查看更多更全内容