当前位置:文档之家› 简单的词法分析器设计

简单的词法分析器设计

《编译原理》
课程设计院系
专业
年级 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.部分单词的正规式与状态转换图
图6、2部分单词的状态转换图
4.功能模块
表6、2 词法分析器的C#程序过程或函数功能表
过程或函数名简要功能说明
void scaner() 分析源程序得到单个单词并大致区分其
类型,并生成二元组
void main( )输入源程序
五、详细设计
1.流程图
图7、1程序总体流程图
六、编程调试
1、源代码
#include"stdio、h"
#include"string、h"
#include"iostream、h"
char prog[100],token[20];
char ch;
int syn,p,m=0,n,row,sum=0;
char *rwtab[6]={"while","do","relop","letter","id","number"};
void scaner()
{
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;
}
}
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<<"请输入字符串(字符#就是字符串输入结束标志):"<<endl;
do
{
cin、get(ch);
prog[p++]=ch;
}
while(ch!='#');
cout<<"字符串输出结果为:"<<endl;
p=0;
do
{
scaner();
switch(syn)
{
case 11: cout<<"("<<syn<<","<<sum<<")"<<endl; break;
case -1: cout<<"Error in row "<<row<<"!"<<endl; break;
case -2: row=row++;break;
default: cout<<"("<<syn<<","<<token<<")"<<endl;break;
}
}
while (syn!=0); }
2、调试
七、收获(体会)与建议
通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,根据识别语言单词的状态转换图,使用某种高级语言直接编写此法分析程序。

相关主题