编译原理词法分析器的构造文档格式.docx

上传人:b****5 文档编号:18584148 上传时间:2022-12-28 格式:DOCX 页数:12 大小:90.71KB
下载 相关 举报
编译原理词法分析器的构造文档格式.docx_第1页
第1页 / 共12页
编译原理词法分析器的构造文档格式.docx_第2页
第2页 / 共12页
编译原理词法分析器的构造文档格式.docx_第3页
第3页 / 共12页
编译原理词法分析器的构造文档格式.docx_第4页
第4页 / 共12页
编译原理词法分析器的构造文档格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

编译原理词法分析器的构造文档格式.docx

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

编译原理词法分析器的构造文档格式.docx

2015.4.10

一、实验目的和要求

设计、编制、调试一个词法分析程序,对单词进行识别和编码,加深对词法分析原理的理解。

二、实验环境(实验设备)

MicrosoftVisualStdio2010

二、

实验原理及内容

1、实验内容:

设计并实现一个词法分析器,实现对指定位置的类C语言源程序文本文件的读取,并能够对该源程序中的所有单词进行分类,指出其所属类型,实现简单的词法分析操作。

例如下面为一段C语言源程序:

main(){

int 

a,b;

a=10;

b=a+20;

}

要求输出如下(可以自行分类,分类原则请在报告中说明)

(1,’main’)

(5,’(’)

(5,’)’)

(5,’{’)

(1,’int’)

(2,’a’)

(5,’,’)

(2,’b’)

(5,’;

’)

(4,’=’)

(3,’10’)

(4,’+’)

(3,’20’)

(5,’}’)

2、实验要求:

(1)、允许用户自己输入源程序并保存为文件

(2)、系统能够输出经过预处理后的源程序(去掉注释、换行、空格等)

(3)、能够将该源程序中所有的单词根据其所属类型(整数、保留字、运算符、标识符等。

定义的类C语言中的标识符只能以字母或下划线开头)进行归类显示,例如:

识别保留字:

if、int、for、while、do、return、break、continue等,其他的都识别为标识符;

常数为无符号整形数;

运算符包括:

+、-、*、/、=、>

、<

、>

=、<

=、!

=等;

分隔符包括:

、;

、{、}、(、)等。

(4)、实现文件的读取操作,而不是将文本以字符串形式预存于程序中。

文本内容为待分析的类C语言程序。

3、实验过程描述

(1)首先讲和书上一样分成5类

分类号

分类内容

1

保留字

2

标识符

3

整数

运算符(+,-,*,/,>

<

=等)

5

分隔符(,,;

,{,},(,))

(2)、接着写出用到的简单文法并转换成状态转换图

<

标识符>

=字母|字母<

|<

数字

<

整数>

=数字|数字<

运算符>

=+|-|*|<

|>

|=

分隔符>

=,|;

|(|)|{|}

保留字是一种特殊的标识符,不独立写出其文法

状态转换图如下:

(3)按照书上的步骤写程序

因为程序要求将用户的输入保存到文件中所以这里要用到文件存贮操作,fopen(FILE*文件名,打开方式)。

一共有三个函数分别是

boolLETTER(charA)//判断字符是否是字母

{

if(A>

='

a'

&

A<

z'

returntrue;

elseif(A>

A'

Z'

elsereturnfalse;

boolDIGIT(charA)//判断字符是否是数字

0'

9'

else

returnfalse;

boolREAERVE(char*a)//判断标识符是否为保留字

{

if(strcmp(a,"

if"

)==0)

{cout<

"

(1,'

a<

'

)"

endl;

returntrue;

int"

for"

while"

do"

return"

break"

continue"

main"

returnfalse;

下面附上全部的代码:

#include<

string.h>

iostream>

fstream>

usingnamespacestd;

boolLETTER(charA)

boolDIGIT(charA)

boolREAERVE(char*a)

boolzimu(charA)

if((A>

)||A>

intmain()

chara;

FILE*f;

charCHAR;

charTOKEN[120];

f=fopen("

code.txt"

"

w"

);

if(f==NULL)

{

cout<

con'

tcreatefile"

exit(0);

}

cout<

pleaseinputyoucode"

while((a=getchar())!

?

fputc(a,f);

fclose(f);

over"

r"

while((CHAR=fgetc(f))!

=EOF)

while(CHAR!

'

{

if(zimu(CHAR))//标括?

识?

符?

{

intk=0;

do{

TOKEN[k]=CHAR;

k++;

}while((CHAR=fgetc(f))!

=EOF&

CHAR!

zimu(CHAR));

if(DIGIT(CHAR))//处鋦理え?

是?

否?

为a包悒?

含?

数簓字?

的?

标括?

{

do{

TOKEN[k]=CHAR;

k++;

}while((CHAR=fgetc(f))!

DIGIT(CHAR));

}

TOKEN[k]='

\0'

;

if(!

(REAERVE(TOKEN)))//判D断?

所ù

得?

为a保馈?

留?

字?

cout<

(2,'

TOKEN<

}

if(DIGIT(CHAR))//整?

数簓

inti=0;

TOKEN[i]=CHAR;

i++;

TOKEN[i]='

REAERVE(TOKEN))

(3,'

if(CHAR=='

+'

||CHAR=='

-'

*'

/'

>

)//运?

算?

cout<

(4,'

CHAR<

'

('

)'

{'

}'

)//分?

隔?

(5,'

break;

}

按恪?

任?

意癮键ü

退?

出?

cin>

CHAR;

return0;

测试结果:

文件存储在code.txt文件中

四、实验小结(包括问题和解决方法、心得体会、意见与建议等)

这次实验让我们更加了解词法分析程序的原理,熟悉了书上词法分析程序构建的步骤,也强化了我们的编程能力,比如说文件读写操作。

在我的程序中,思考了很久也没能实现”<

=””>

=”和”!

=”的词法分析。

拿”>

=”举例来说,CHAR读了”>

”之后,进行判断如果是”=”就输出“(4,’>

=’)”。

但是如果接下来的字符不是”=”,就需要判断这个CHAE字符是否为字母、数字、分隔符、其他运算符,这样就会和之前的判断进入一个死循环(因为在保留字判断的时候也要多读一个字符,判断为否定后要比较这个字符是否为数字,分隔符,运算符)。

总的来说就是我不能将文件指针前移,导致这里写不出来,这是这次实验中的瑕疵。

五、指导教师评语

成绩

批阅人

日期

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

当前位置:首页 > 经管营销 > 人力资源管理

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

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