您的当前位置:首页正文

简单的词法分析器设计

2023-03-15 来源:客趣旅游网
《编译原理》

课程设计

院 系 _________________

专 业 _________________________ 年 级 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<<\" 字符串输出结果为 :\"<{ scaner(); switch(syn) { case 11: cout<<\"(\"<case -1: cout<<\"Error in row \"<row=row++;break; default: cout<<\"(\"<} 2

}

while (syn!=0);

调试

七、收获(体会)与建议

通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词 法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理, 根据识别 语言单词的状态转换图,使用某种高级语言直接编写此法分析程序。

因篇幅问题不能全部显示,请点此查看更多更全内容