简单的词法分析器设计.docx
《简单的词法分析器设计.docx》由会员分享,可在线阅读,更多相关《简单的词法分析器设计.docx(12页珍藏版)》请在冰点文库上搜索。
简单的词法分析器设计
简单的词法分析器设计
《编译原理》
课程设计
院系
专业
年级11级
学号
姓名
2014年05月
实验一简单的词法分析器设计
一、设计内容
熟悉并实现一个简单的词法分析器
二、设计目的
了解高级语言单词的分类,了解如何识别单词规则,掌握状态图到识别程序的编程。
源程序中,存在许多编辑用的符号,他们对程序逻辑功能无任何影响。
例如:
回车,换行,多余空白符,注释行等。
在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。
三、实验步骤
1.
将每个单词符号进行不同类别的划分。
单词符号可以划分成5中。
(1)标识符:
用户自己定义的名字,常量名,变量名和过程名。
(2)常数:
各种类型的常数。
(3)保留字(关键字):
如if、begin、then、while、do等。
(4)运算符:
如+、-、*、<、>、=等。
(5)界符:
如逗号、分号、括号等。
2.
将所有合法的单词符号转化为便于计算机处理的二元组形式:
(单词分类号,单词自身值);以图形化界面显示出来。
3.
可选择性地将结果保存到文件中。
四、概要设计
1.待分析的简单语言的词法
(1)关键字:
whiledorelopletteridnumber所有关键字都是小写。
(2)运算符和界符:
:
=+–*/<<=<>>>==;()#
(3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:
如课本P20例
空格由空白、制表符和换行符组成。
空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。
2.词法分析器的结构
图词法分析器的结构
3.部分单词的正规式与状态转换图
图部分单词的状态转换图
4.功能模块
表词法分析器的C#程序过程或函数功能表
过程或函数名
简要功能说明
voidscaner()
分析源程序得到单个单词并大致区分其类型,并生成二元组
voidmain()
输入源程序
五、详细设计
1.流程图
图程序总体流程图
六、编程调试
1.源代码
#include""
#include""
#include""
charprog[100],token[20];
charch;
intsyn,p,m=0,n,row,sum=0;
char*rwtab[6]={"while","do","relop","letter","id","number"};
voidscaner()
{
for(n=0;n<8;n++)token[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;
}
}
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;
}
}
voidmain()
{
p=0;
row=1;
cout<<"请输入字符串(字符#是字符串输入结束标志):
"<do
{
(ch);
prog[p++]=ch;
}
while(ch!
='#');
cout<<"字符串输出结果为:
"<p=0;
do
{
scaner();
switch(syn)
{
case11:
cout<<"("<case-1:
cout<<"Errorinrow"<"<case-2:
row=row++;break;
default:
cout<<"("<}
}
while(syn!
=0);
}
2.调试
七、收获(体会)与建议
通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用某种高级语言直接编写此法分析程序。
|