词法分析器的设计实验Word文档下载推荐.docx

上传人:聆听****声音 文档编号:1027147 上传时间:2023-04-30 格式:DOCX 页数:14 大小:106.87KB
下载 相关 举报
词法分析器的设计实验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

class

105

protected

125

const

106

public

126

continue

107

register

127

default

108

return

128

delete

109

short

129

do

110

sizeof

130

double

111

static

131

else

112

struct

132

enum

113

switch

133

extern

114

template

134

float

115

this

135

for

116

typedef

136

friend

117

union

137

if

118

virtual

138

inline

119

void

139

int

120

while

140

201

234

202

->

235

*

203

·

236

/

204

[

237

%

205

]

238

++

206

239

--

207

240

208

241

>=

209

{

242

210

}

243

<=

211

#

244

==

212

245

213

标识符

300

&

214

常数

400

二进制形式

||

215

!

216

<<

217

>>

218

~

219

|

220

^

221

222

223

+=

224

-=

225

*=

226

/=

227

%=

228

>>=

229

<<=

230

231

^=

232

|=

233

三、实验步骤

1.基本思想

从源程序中依次读入字符并解析,与关键字、运算符、结束符进行比较,得出其中的关键字,并将它存入到数组中去。

2.程序流程图

3.实验的输入源文件(input.txt)

inta=3;

doubleb=4;

intc;

doubled=5;

if(a>

b)c=a;

elsec=b;

if(c<

d)c=d;

elsec=c

4.实验输出截图

为了便于语法分析程序使用此法分析程序的结果,将此法分析程序的结果输出到output.txt

文件中,其内容如下所示:

5.实验源代码:

#include<

stdio.h>

#include<

cstring>

stdlib.h>

#defineMaxSize1 17

#defineMaxSize2 20

#defineMaxSize3 4structTNode

charvalue[20];

intnumber;

chardescription[20];

}KeyWords[MaxSize1],Operation[MaxSize2],EndOperation[MaxSize3];

*WordsBuff[MaxSize1]={"

const"

"

long"

float"

double"

void"

main"

if"

else"

then"

break"

int"

char"

include"

for"

while"

printf"

scanf"

};

char *OperationBuff[MaxSize2]={"

+"

-"

*"

/"

+="

-="

*="

++"

--

"

<

="

>

("

)"

#"

{"

}"

charEndOperationBuff[MaxSize3]={'

'

'

;

'

\n'

\t'

TNodeTable1[500];

TNodeVariable[100];

TNodeConst[100];

voidinputKeyWords(char*buff[],intsize)

for(inti=0;

i<

size;

i++)

strcpy(KeyWords[i].value,buff[i]);

KeyWords[i].number=i+1;

strcpy(KeyWords[i].description,"

关键字"

);

voidinputOperation(char*buff[],intsize)

strcpy(Operation[i].value,buff[i]);

Operation[i].number=i+50;

strcpy(Operation[i].description,"

运算符"

voidinputEndOperation(charbuff[],intsize)

EndOperation[i].value[0]=buff[i];

EndOperation[i].value[1]='

\0'

EndOperation[i].number=i+100;

strcpy(EndOperation[i].description,"

结束符"

voidoutputInfo(TNodea[],intsize)

printf("

(%d"

a[i].number);

printf("

\t"

%s)"

a[i].value);

printf(a[i].description);

\n"

voidoutInfoToFile(TNodea[],intsize,FILE*out)

fprintf(out,"

fprintf(out,"

fprintf(out,a[i].description);

chargetChar(FILE*fp)

charch=fgetc(fp);

returnch;

intisOperation(chara[])

intresult;

MaxSize2;

result=strcmp(a,Operation[i].value);

if(result==0)

returni;

break;

return-1;

intisKeyWords(chara[])

MaxSize1;

result=strcmp(a,KeyWords[i].value);

intisEndOperation(chara)

MaxSize3;

if(a==EndOperation[i].value[0])

intisChar(chara)

if(a>

='

a'

a<

z'

)return1;

elseif(a>

A'

Z'

return0;

intisDigit(chara)

0'

9'

intcount=0;

intcount1=0;

intcount2=0;

intstart1(FILE*in)

charbuff[20];

charnextchar[2];

chartemp[20];

inti=0;

inta;

charop[3];

op[2]='

nextchar[0]=fgetc(in);

nextchar[1]='

while(nextchar[0]!

=EOF)

if(isChar(nextchar[0]))

buff[i]=nextchar[0];

i++;

nextchar[0]=fgetc(in);

elseif(isDigit(nextchar[0]))

elseif(nextchar[0]=='

\r'

||nextchar[0]=='

buff[i]='

a=isKeyWords(buff);

if(a!

=-1&

i>

0)

strcpy(Table1[count].value,KeyWords[a].value);

Table1[count].number=KeyWords[a].number;

elseif(i>

strcpy(Table1[count].description,KeyWords[a].description);

count++;

i=0;

if(isChar(buff[0]))

strcpy(Variable[count1].value,buff);

Variable[count1].number=count1;

strcpy(Variable[count1].description,"

标识符"

count1++;

i=0;

elseif(isDigit(buff[0]))

strcpy(Const[count2].value,buff);

Const[count2].number=count2;

strcpy(Const[count2].description,"

常量"

count2++;

elseif(isEndOperation(nextchar[0])!

=-1)

strcpy(Table1[count].description,KeyWords[a].description);

strcpy(temp,KeyWords[a].value);

count++;

elseif((a=isOperation(nextchar))!

Variable[count1].number=count1;

count1++;

op[0]=nextchar[0];

if(nextchar[0]!

@'

if(isOperation(nextchar)!

op[1]=nextchar[0];

if((a=isOperation(op))!

strcpy(Table1[count].value,Operation[a].value);

Table1[count].number=Operation[a].number;

strcpy(Table1[count].description,Operation[a].description);

strcpy(Table1[count].value,op);

Table1[count].number=-1;

strcpy(Table1[count].description,"

未定义的运算符"

op[1]='



a=isOperation(op);

strcpy(Table1[count].value,Operation[a].value);

strcpy(Table1[count].description,Operation[a].description);

}}}}

returncount;

voidmain()

inputKeyWords(WordsBuff,MaxSize1);

inputOperation(OperationBuff,MaxSize2);

inputEndOperation(EndOperationBuff,MaxSize3);

FILE*in,*out;

boolFlag=true;

while(Flag)

源文件的位置:

D:

\\input.txt\n"

if((in=fopen("

D:

\\input.txt"

r"

))==NULL)

读取源文件失败!

exit(0);

if((out=fopen("

\\output.txt"

w"

打开文件失败!

exit(0);

intMaxSize=start1(in);

关键字及运算符\n"

outputInfo(Table1,MaxSize);

outInfoToFile(Table1,MaxSize,out);

标识符表:

标识符表:

outputInfo(Variable,count1);

outInfoToFile(Variable,count1,out);

常量表:

常量表:

outputInfo(Const,count2);

outInfoToFile(Const,count2,out);

Flag=false;

fclose(in);

fclose(out);

四、实验中发现的问题和遇到的困难:

4.1分析出的关键字、运算符、标识符等的保存问题

4.2文本文件中的转义字符问题

五、问题及困难的解决:

5.1:

对于保存的问题,我们设计了一种数据结构如下所示:

structTNode

//存放标识符的值intnumber;

//存放标识符的种别码chardescription[20];

//描述

软后申明这种类型的数组来保存关键字、运算符、标识符和常量等。

5.2:

转义字符是C语言中表示字符的一种特殊形式。

通常使用转义字符表示ASCII码字符集中不可打印的控制字符和特定功能的字符,如用于表示字符常量的单撇号( '

),用于表示字符串常量的双撇号( "

)和反斜杠( \)等。

转义字符用反斜杠\后面跟一个字符或一个八进制或十六进制数表示,文本文件中的打一下回车键对应的字符是’\r’’\n’,是两个字符

六、总结

第一个编译原理课程实验已经结束了,在这一个星期里的时间里,通过实验,让我感受到许多不足。

历本次实训,从中学到很多东西,这次实训的宝贵经验也肯定将会成为我在以后成长道路上的一笔丰富财富!

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

当前位置:首页 > 经管营销 > 公共行政管理

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

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