简单的词法分析器设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《编译原理》
课程设计院系
专业
年级 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<<"请输入字符串(字符#就是字符串输入结束标志):"< do { cin、get(ch); prog[p++]=ch; } while(ch!='#'); cout<<"字符串输出结果为:"< p=0; do { scaner(); switch(syn) { case 11: cout<<"("< case -1: cout<<"Error in row "< case -2: row=row++;break; default: cout<<"("< } }