简单的词法分析器设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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<<"("<

}

}

相关文档
最新文档