词法分析设计实验报告附代码Word下载.docx

上传人:b****1 文档编号:4385011 上传时间:2023-05-03 格式:DOCX 页数:14 大小:171.63KB
下载 相关 举报
词法分析设计实验报告附代码Word下载.docx_第1页
第1页 / 共14页
词法分析设计实验报告附代码Word下载.docx_第2页
第2页 / 共14页
词法分析设计实验报告附代码Word下载.docx_第3页
第3页 / 共14页
词法分析设计实验报告附代码Word下载.docx_第4页
第4页 / 共14页
词法分析设计实验报告附代码Word下载.docx_第5页
第5页 / 共14页
词法分析设计实验报告附代码Word下载.docx_第6页
第6页 / 共14页
词法分析设计实验报告附代码Word下载.docx_第7页
第7页 / 共14页
词法分析设计实验报告附代码Word下载.docx_第8页
第8页 / 共14页
词法分析设计实验报告附代码Word下载.docx_第9页
第9页 / 共14页
词法分析设计实验报告附代码Word下载.docx_第10页
第10页 / 共14页
词法分析设计实验报告附代码Word下载.docx_第11页
第11页 / 共14页
词法分析设计实验报告附代码Word下载.docx_第12页
第12页 / 共14页
词法分析设计实验报告附代码Word下载.docx_第13页
第13页 / 共14页
词法分析设计实验报告附代码Word下载.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

词法分析设计实验报告附代码Word下载.docx

《词法分析设计实验报告附代码Word下载.docx》由会员分享,可在线阅读,更多相关《词法分析设计实验报告附代码Word下载.docx(14页珍藏版)》请在冰点文库上搜索。

词法分析设计实验报告附代码Word下载.docx

=、=、>

、>

=、<

>

◆分界符:

、,、(、)、[、];

三、实验要求

1、编程时注意编程风格:

空行的使用、注释的使用、缩进的使用等。

2、将标识符填写的相应符号表须提供给编译程序的以后各阶段使用。

3、根据测试数据进行测试。

测试实例应包括以下三个部分:

◆全部合法的输入。

◆各种组合的非法输入。

◆由记号组成的句子。

4、词法分析程序设计要求输出形式:

例:

输入VC++语言的实例程序:

Ifi=0thenn++;

a﹤=3b%);

输出形式为:

单词二元序列类型位置(行,列)

(单词种别,单词属性)

for(1,for)关键字(1,1)

i(6,i)标识符(1,2)

=(4,=)关系运算符(1,3)

0(5,0)常数(1,4)

then(1,then)关键字(1,5)

n(6,n)标识符(1,6)

++ErrorError(1,7)

(2,;

)分界符(1,8)

a(6,a)标识符(2,1)

﹤=(4,<

=)关系运算符(2,2)

3bErrorError(2,4)

%ErrorError(2,4)

)(2,))分界符(2,5)

)分界符(2,6)

实验报告正文:

◆功能描述:

该程序具有词法分析功能,即面对一段程序源代码,通过该程序,能检查出源代码是否由词法错误。

◆三、词法分析实验设计思想及算法:

◆首先构造六个表,key[]={"

auto"

"

break"

case"

catch"

char"

class"

const"

continue"

default"

delete"

do"

double"

else"

enum"

float"

for"

if"

int"

long"

new"

private"

protected"

public"

register"

return"

short"

static"

struct"

switch"

this"

void"

while"

then"

};

关键字表,单词种别码1;

Delimiter[]={"

;

"

("

)"

["

]"

."

{"

}"

分界符表单词种别码2

Operator[]={"

+"

-"

*"

/"

算术运算符表单词种别码3

R_operators[]={"

<

="

=="

},关键字表,单词种别码1;

stringNumber[100];

常数表单词种别码5;

stringIdentifier[100];

标示符表单词种别码6;

构造关键字判断函数Iskey(),字母判断函数Isletter(),数字判断函数Isnumber();

构造标示符判别函数InsertId(),若输入的标示符在标示符数组Identifier[]中,返回其下标,若不在,将该标示符插到数组末尾。

构造标示符判别函数InsertNumber(),若输入的数字在数字数组Number[]中,返回其下标,若不在,将该数字插到数组末尾。

具体分析函数analyse()具体实现输入源代码的识别。

anaiyse()构造思路,程序设计图:

 

综合以上分析,画出整个程序的运行分析程序图,如下:

整个程序的运行分析程序图

◆软件的测试方法和测试结果:

首先,将要分析的源代码写入一个文本,存于磁盘中,然后运行程序,输入源代码文件存放的路径,若输入路径正确,程序将自动分析源代码,若输入路径不正确,程序将显示,路径错误,请重新输入的提示。

下面为具体的运行实例:

源代码为:

a﹤=3b%)

输出满足要求。

◆实验总结(设计的特点、不足、收获与体会):

 

通过此次实验,让我了解到如何设计、编制并调试词法分析程序,熟悉了构造词法分析程序的手工方式的相关原理,加深了对编译原理词法分析的理解,本次使用C++语言直接编写此法分析程序,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。

本程序的数据输入采取直接从文件中读取,而不是由键盘输入,因此在测试过程中,输入得到大大简化,但是本程序的关键字表只初始化了一部分关键字,还可继续扩充(只需扩大数组,向其中补充要添加的关键字),而且程序的测试数据存在不足,程序可能存在未发现的漏洞,以上两点有待改善。

附录该程序的源代码:

#include<

iostream>

#include<

string>

usingnamespacestd;

//数据定义

#defineMAX33

charch='

'

staticintline=1,row=0;

intNumberCount=0,IdCount=0;

stringkey[]={"

//关键字表单词种别码1

stringDelimiter[]={"

//分界符表单词种别码2

stringOperator[]={"

//算术运算符表单词种别码3

stringR_operators[]={"

//关系运算符表单词种别码4

//常数表单词种别码5

//标示符表单词种

别码6//数据分析

intIskey(stringc){//关键字判断

inti;

for(i=0;

i<

MAX;

i++){

if(key[i].compare(c)==0)return1;

}

return0;

}//判断是否为字母

intIsLetter(charc){

if(((c<

='

z'

)&

&

(c>

a'

))||((c<

Z'

A'

))){

if((ch<

(ch>

))ch=ch+32;

//转换成小写

return1;

}

elsereturn0;

}

intIsNumber(charc){//判断是否为数字

if(c>

0'

c<

9'

)return1;

//将arr中的标示符插入符号表并且返回符号表的指针

intInsertId(strings){

for(inti=0;

IdCount;

i++)

{

if(Identifier[i]==s){

returni;

break;

}

elseif(IdCount==i+1){

Identifier[IdCount]=s;

returnIdCount;

IdCount++;

}

}//将arr中的常实数插入常数表并且返回常数表的指针

intInsertNumber(strings){

for(inti=0;

NumberCount;

if(Number[i]==s){

elseif(NumberCount==i+1){

Number[NumberCount]=s;

returnNumberCount;

NumberCount++;

voidanalyse(FILE*fpin){

//arr相当于课本中的strToken

stringarr="

while((ch=fgetc(fpin))!

=EOF)//判断是否读取到文件末尾或者读取出错

arr="

if(ch=='

||ch=='

\t'

\n'

)//删除空格类字符,包括回车、制表符空格

{

if(ch=='

){

line++;

row=0;

elseif(IsLetter(ch))

while(IsLetter(ch)||IsNumber(ch))

{

arr=arr+ch;

ch=fgetc(fpin);

fseek(fpin,-1L,SEEK_CUR);

//文件指针回移一个位置

if(Iskey(arr))

{

row++;

//识别出一个字符,列增加一

cout<

arr<

\t\t(1,"

<

\t\t关键字"

\t\t("

line<

row<

endl;

}

else

row++;

InsertId(arr);

cout<

\t\t(6,"

\t\t标识符"

//处理常数

elseif(IsNumber(ch))

{

while(IsNumber(ch))//||ch=='

.'

IsNumber(fgetc(fpin))

arr=arr+ch;

if(IsLetter(ch))

while(IsLetter(ch)||IsNumber(ch))

{

arr=arr+ch;

}

fseek(fpin,-1L,SEEK_CUR);

cout<

\t\tError"

else{

InsertNumber(arr);

row++;

cout<

\t\t(5,"

\t\t常数"

}//处理算符

else{

arr=ch;

switch(ch){

case'

+'

:

{

ch=fgetc(fpin);

('

||IsNumber(ch)||IsLetter(ch))

fseek(fpin,-1L,SEEK_CUR);

\t\t(3,+)"

\t\t算术运算符"

else

arr+ch<

}break;

-'

:

if(ch=='

{fseek(fpin,-1L,SEEK_CUR);

\t\t(3,-)"

else{cout<

*'

\t\t(3,*)"

{cout<

\t\t(4,==)"

\t\t关系运算符"

else{fseek(fpin,-1L,SEEK_CUR);

\t\t(4,=)"

\t("

/'

ch<

\t\t(3,"

)"

break;

)'

['

]'

case'

'

'

{'

}'

\t\t(2,"

\t\t分界符"

{ch=fgetc(fpin);

)cout<

\t\t(4,>

=)"

else{cout<

}break;

\t\t(4,<

elseif(ch=='

default:

intmain(){

charin_fn[30];

FILE*fpin;

请输入源文件名(包括路径和后缀名):

for(;

cin>

in_fn;

if((fpin=fopen(in_fn,"

r"

))!

=NULL)break;

elsecout<

文件路径错误!

\n********************分析如下*********************"

单词二元序列类型位置(行,列)"

analyse(fpin);

fclose(fpin);

}

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

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2