编译原理实验词法分析器的设计Word格式.docx

上传人:b****6 文档编号:19876900 上传时间:2023-01-11 格式:DOCX 页数:12 大小:138.07KB
下载 相关 举报
编译原理实验词法分析器的设计Word格式.docx_第1页
第1页 / 共12页
编译原理实验词法分析器的设计Word格式.docx_第2页
第2页 / 共12页
编译原理实验词法分析器的设计Word格式.docx_第3页
第3页 / 共12页
编译原理实验词法分析器的设计Word格式.docx_第4页
第4页 / 共12页
编译原理实验词法分析器的设计Word格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

编译原理实验词法分析器的设计Word格式.docx

《编译原理实验词法分析器的设计Word格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验词法分析器的设计Word格式.docx(12页珍藏版)》请在冰豆网上搜索。

编译原理实验词法分析器的设计Word格式.docx

单词种别码要求

保留字

if、else、int、while、do

每个保留字的单词种别都单独为一种

标识符

以字母开头且包含字母和数字的字符串

标识符作为一种

常数(只识别无符号整数)

123、343

无符号整数作为一种

运算符

+、-、*、/、=、==、!

=、>

、<

、>

=、<

=

每符一种,也可以每一类符号一种

分隔符

、;

、{、}、(、)

每符一种

2、上述要求仅为基本要求,可以在此基础上扩充,例如删除注释,增加识别单词的类型,将标识符和常量分别插入到相应的符号表中,增加错误处理等。

3、编程语言不限。

 

四、实验设计方案

1、数据字典

本实验用到的数据字典如下表所示:

标识ID

void、if、else、for、while、do、return、break、main、int、float、char、double、String

1

2

无符号整数和小数

3

+、-、*、/、=、>

4

5

本实验所使用的开发语言是C语言,在Test2类中定义了以下几个函数:

2.程序流程图:

Y

N

YN

N

YY

N

YN

YY

NN

YY

NNN

Y

NYN

3、实验程序

#include<

stdio.h>

string.h>

ctype.h>

windows.h>

//判断读入的字符是否为字母

boolisLetter(charc){

if((c>

='

a'

&

&

c<

z'

)||(c>

A'

Z'

)){

returntrue;

}

else

returnfalse;

}

//判断读入的字符是否为数字

boolisDigit(charc){

if(c>

='

0'

9'

){

//判断是否为关键字

boolisKey(char*string){

if(!

strcmp(string,"

void"

)||!

if"

)||!

for"

while"

||!

do"

return"

break"

main"

int"

float"

char"

double"

String"

))

{

returntrue;

elsereturnfalse;

boolisError(charch){

if(ch=='

'

||ch=='

$'

#'

~'

^'

returnfalse;

voidmain()

{

charstring[500]="

"

;

//存放文件中读出来的字符串

charstr[10]="

//存放需要对比的字符串

charch,c;

//ch存放文件中的单个字符(翻译时用),c存放文件中的单个字符(从文件中提取信息时用)

charfilename[20];

//文件名

intj=0;

printf("

请输入文件名进行词法翻译:

);

scanf("

%s"

filename);

FILE*cfPtr;

if((cfPtr=fopen(filename,"

r"

))==NULL)

printf("

文件未找到!

else{

while(!

feof(cfPtr)){

if(isspace(c=fgetc(cfPtr))){//判断是否是字符串

;

}else{

string[j]=c;

//从文件中一一提取字符

j++;

}

}

intm=0,k=0;

//m翻译时用,k是str数组的下标

string[j]='

'

j++;

boolcheck=true,error=false;

//用于判断标识

for(inti=0;

i<

j;

i++){//实现语法翻译器

switch(m)

{

case0:

ch=string[i];

if(ch=='

+'

-'

*'

/'

||ch=='

>

<

{

if(error){

printf("

%s,此字符无法是识别!

\n"

str);

error=false;

check=true;

}elseif(!

check){

(2,%s)标示符\n"

}

m=4;

}

elseif(ch=='

'

{'

}'

('

)'

{

%s此字符无法识别\n"

m=5;

}

elseif(isDigit((ch=string[i])))

if(check){

memset(str,0,strlen(str));

//清空

k=0;

str[k]=ch;

k++;

m=3;

check=false;

}else{

elseif(isLetter(ch=string[i]))

}else{

if(isKey(str))

{

printf("

(1,%s)关键字\n"

check=true;

}

}elseif(isError(ch=string[i])){

error=true;

}else{}

break;

case3:

if(isLetter(ch=string[i])){

printf("

程序有错误!

str[k]=ch;

k++;

error=true;

m=0;

break;

if(isError(ch=string[i])){

if(isDigit((ch=string[i])))

}elseif(ch=='

.'

str[k]=ch;

else

(3,%s)数字\n"

i--;

check=true;

case4:

i--;

printf("

(4,%c)运算符\n"

ch);

m=0;

case5:

i--;

(5,%c)分隔符\n"

}

return;

五、实验结果

六、实验小结

本次实验中,运用C语言进行实验,实验刚开始的时候,能够对输入的字符进行判断,但是却不能排错以及只能识别全是字母的标识符,后来经过修改程序代码和编程的逻辑最终实现了,既能排错又能分析句子;

通过实验掌握了词法分析,能实现对普通程序的语法分析翻译。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1