实验一词法分析报告.docx

上传人:b****2 文档编号:12892563 上传时间:2023-04-22 格式:DOCX 页数:25 大小:54.24KB
下载 相关 举报
实验一词法分析报告.docx_第1页
第1页 / 共25页
实验一词法分析报告.docx_第2页
第2页 / 共25页
实验一词法分析报告.docx_第3页
第3页 / 共25页
实验一词法分析报告.docx_第4页
第4页 / 共25页
实验一词法分析报告.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

实验一词法分析报告.docx

《实验一词法分析报告.docx》由会员分享,可在线阅读,更多相关《实验一词法分析报告.docx(25页珍藏版)》请在冰豆网上搜索。

实验一词法分析报告.docx

实验一词法分析报告

实验一词法分析

1•实验要求

(1)从源程序文件中读取有效字符并将其转换成二元组内部表示形式输出

(2)掌握词法分析的实现方法。

(3)实验时间4学时。

(4)实验完成后,要提交实验报告(包括源程序清单)。

2•实验内容

2.1主程序设计考虑:

主程序的说明部分为各种表格和变量安排空间(关键字和特殊符号表)。

id和ci数组分别存放标识符和常数;还有一些为造表填表设置的变量。

主程序的工作部分建议设计成便于调试的循环结构。

每个循环处理一个单词;调用词

法分析过程;输出每个单词的内部码(种别编码,属性值)。

建议从文件中读取要分析的

符号串。

22词法分析过程考虑

该过程根据输入单词的第一个有效字符(有时还需读第二个字符),判断单词种别,

产生种别编码。

对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,

如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id

中,将常数存入数组中ci中,并记录其在表中的位置

编号

1

2

3

4

5

6

7

8

9

10

名字

int

char

float

void

const

if

else

do

while

scanf

编号

11

12

13

14

15

16

17

18

19

20

名字

printf

return

main

read

+

*

/

%

=

编号

21

22

23

24

25

26

27

28

29

30

名字

==

>

<

=

>=

<=

&&

II

!

<>

编号

31

32

33

34

35

36

37

38

39

40

名字

{

}

5

a

c

++

--

主流程图如下:

 

读源程序字符

Y

N

Y

是数字?

字母?

A1X

Y

输出单词的内部表示

出口

N

是有字符?

开工操作

常数分析程序

其它单词分析程序

关键字和标识符分析程序

N

四:

实验思路

(1)我首先把这个单词的种类分成了五类,包括:

关键字、标识符、常数、算符、界符。

然后利用状态转换图进行单词的识别

(2)对于关键字、算符、界符。

因为这些单词的个数有限。

所以我单独给每个

单词一个种别编码。

能够做到每个单词的种别编码是不一样的。

而对于常数和

标识符,我先把它们分别单独的作为一类,然后定义一个二维数组,分别存放这个单词的名称和编码。

而这个编码就是这个单词在这个二维数组中的位置;

当遇到新的标识符或常数,就把这个单词放入到相应的数组中。

(3)然后构造一个状态转换图的程序。

把每次得到的单词先暂时存放在temp二维数组中。

然后用这个临时的二维数组去确定这个单词是何种类别

五:

实验代码

usingSystem;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Data;

usingSystem.Drawing;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Threading.Tasks;

usingSystem.Windows.Forms;

namespaceWord{

publicpartialclassForml:

Form

{

publicForm1()

{

InitializeComponent();

}

char[]receive;//从输入得到的源程序

charch;//这是从源程序读取的一个字符

stringcache;//暂存的单词

intindex;//记录取到哪个位置了

key_wordtemp;//用来临时存放得到这个单词

structkey_word

{

publicstringkey_name;

publicintnumber;

}

structnum_word

{

publicstringnum_name;

publicintnumber;

structID_word

{

publicstringID_name;

publicintnumber;

}

publicintnum_index;

publicintID_index;

DataTabledt;

EventArgse)

privatevoidbutton1_Click(objectsender,

dt=newDataTable();

dt.Columns.Add("

助记符");

dt.Columns.Add("

外部编码”

dt.Columns.Add("

内部编码”

dt.Columns.Add("

类型");

receive=textBox1.Text.ToCharArray();

index=0;

num_index=0;

ID_index=0;;

while(index

cache=null;

Get_Word();

if(temp.number==1)

{

inti=0;

intflag=0;

if(num_index==0)

{

Num[num_index].num_name

Num[num_index].numbernum_index++;

}

else

{

for(i=0;i

{

if(Num[i].num_name

{

flag=i;

=temp.key_name;

num_index;

i++)

=temp.key_name)

 

break;

}

}

if(i>=num_index)

{

Num[num_index].num_name=temp.key_name;

Num[num_index].number=num_index;

flag=num_index;

num_index++;

}

}

DataRowdr=dt.NewRow();

dt.Rows.Add(dr);

dr["助记符"]=temp.key_name;

dr["外部编码"]=temp.number;

dr["内部编码"]=+Num[flag].number;

dr["类型”]="常数";

 

}else

{

if(temp.number==0)

inti=0;

intflag=0;

 

if(ID_index

0)

 

ID[ID_index].ID_name=temp.key_name;

ID[ID_index].number=ID_index;

ID_index++;

}else

for(i=0;i

if(ID[i]」D_name==temp.key_name)

{

flag=i;

break;

}

}

if(i>=ID」ndex)

{

ID[ID_index]」D_name=temp.key_name;

ID[ID_index].number=ID_index;

flag=ID_index;

ID_index++;

}

DataRowdr=dt.NewRow();

dt.Rows.Add(dr);

dr["助记符"]=temp.key_name;

dr["外部编码"]=temp.number;

dr["内部编码"]=ID[flag].number;

dr["类型"]="标识符";

}

else

{

DataRowdr=dt.NewRow();

dt.Rows.Add(dr);

dr["助记符"]=temp.key_name;

dr["外部编码"]=temp.number;

if(temp.number>=15&&temp.number<=30)

{

dr["类型"]="运算符";

}

40)

elseif(temp.number>=31&&temp.number<=

{

dr["类型"]="界符";

else

{

dr[”类型”]="关键字”;

}

}

}

this.dataGridViewl.DataSource=dt;

}

key_word[]Key;

num_word[]Num;

ID_word[]ID;

privatevoidForm1_Load(objectsender,EventArgse)

{

index=0;

Key=newkey_word[41];

Key[O].key_name="$ID";Key[0].number=0;//标识符

Key[1].key_name="$INT";Key[1].number=1;//数

"float";

="con

Key[2].key_name="int";Key[2].number=2;Key[3].key_name=

Key[3].number=3;

Key[4].key_name="void";Key[4].number=4;Key[5].key_name

st";Key[5].number=5;Key[6].key_name="if:

Key[6].number=6;Key[7].key_name

="else";Key[7].number=7;

Key[8].key_name="do";Key[8].number=8;Key[9].key_name="while";

Key[9].number=9;Key[10].key_name="scanf:

Key[10].number=10;Key[11].key_

name="printf:

Key[11].number=11;

Key[12].key_name="return";Key[12].number=12;Key[13].key_name

="main";Key[13].number=13;Key[14].key_name="read";Key[14].number=14;

Key[15].key_name="+";Key[15].number=15;

Key[16].key_name="-";Key[16].number=16;Key[17].key_name="*";

Key[17].number=17;Key[18].key_name="/";Key[18].number=18;Key[19].key_n

ame="%";Key[19].number=19;

Key[20].key_name="=";Key[20].number=20;Key[21].key_name="==";Key[21].number=21;Key[22].key_name=">";Key[22].number=22;Key[23].key_name="<";Key[23].number=23;

Key[24].key_name="!

=";Key[24].number=24;Key[25].key_name=">=";Key[25].number=25;Key[26].key_name="<=";Key[26].number=26;Key[27].key_name="&&";Key[27].number=27;

Key[28].key_name="||";Key[28].number=28;Key[29].key_name="!

";

Key[29].number=29;Key[30].key_name="<>";Key[30].number=30;

Key[31].key_name="(";Key[31].number=31;

Key[32].key_name=")";Key[32].number=32;Key[33].key_name="{";

Key[33].number=33;

Key[34].key_name="}";Key[34].number=34;Key[35].key_name=";";

Key[35].number=35;

Key[36].key_name=",";Key[36].number=36;Key[37].key_name="\"

";Key[37].number=37;Key[38].key_name=""';Key[38].number=38;Key[39].key_

name="++";Key[39].number=39;

Key[40].key_name="--";Key[40].number=40;

Num=newnum_word[1024];

ID=newID_word[1024];

//得到一个字符

publicvoidGetChar()

{

if(index

{

ch=receive"ndex];

index++;

}

else

ch='\0';

publicvoidGetNotKong()//得到一个不是空的字符

{

while(index

{

ch=receive"ndex];

index++;

if(ch!

=''&&ch!

='\r'&&ch!

='\0'&&ch!

='\n')

{

break;

}

}

}

publicvoidConCat()//连接

{

cache+=ch;

}

publicboollsLetter()//判断是不是字母

if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')

{

returntrue;

}

else

{

returnfalse;

}

}

publicboollsDigit()//判断是不是数字

{

if(ch>='O'&&ch<=9)

{

returntrue;

}

else

{

returnfalse;

}

}

publicintGet_Number()//得到这个单词的编码

for(inti=0;i<41;i++)

if(string.Equals(cache,Key[i].key_name))

{

returnKey[i].number;

}

}

{

return0;

}

}

publicvoidretrace()//退回一个单词

{

if(ch!

='\0')

{

index--;

}

}

privatevoidGet_Word()

{

intcount;

GetNotKong();

if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')

ConCat();

GetChar();

while(lsLetter()||lsDigit())

{

ConCat();

GetChar();

}

retrace。

;count=Get_Number();

temp.key_name=cache;

if(count==0)

{

temp.number=0;

}

else

{

temp.number=Key[count].number;

}

}

elseif(ch>='O'&&ch<=9)

ConCat();

GetChar();

while(lsDigit())

{

ConCat();

GetChar();

}

retrace();

temp.key_name=cache;

temp.number=1;

if(ch=='+')

}else

{

ConCat();

GetChar();

if(ch=='+')

{

ConCat();

temp.key_name=cache;

temp.number

39;

}

else

{

retrace。

=cache;

Get_Number();

temp.key_name

temp.number=

}

}

elseif(ch=='-')

{

ConCat();

GetChar();

if(ch=='-')

{

ConCat();

=cache;

40;

temp.key_name

temp.number=

}

else

{

retrace();

=cache;

Get_Number();

temp.key_nametemp.number=

}

}

elseif(ch=='<')

{

ConCat();

GetChar();

if(ch=='=')

{

=cache;

26;

ConCat();

temp.key_name

temp.number=

}

else

{

=cache;

Get_Number();

retrace();

temp.key_name

temp.number=

}

}

elseif(ch=='>')

GetChar();

if(ch=='=')

{

ConCat();

=cache;

25;

temp.key_name

temp.number=

}

else

{

retrace。

=cache;

Get_Number();

temp.key_name

temp.number=

}

ConCat();

GetChar();

if(ch=='=')

{

=cache;

21;

temp.key_nametemp.number=

}

else

{

=cache;

Get_Number();

retrace。

;temp.key_nametemp.number=

}

}

elseif(ch=='!

')

{

ConCat();

GetChar();

if(ch=='=')

{

=cache;

24;

ConCat();

temp.key_name

temp.number=

}

else

}else

{

retrace。

temp.key_nametemp.number=

}

if(ch=='&')

=cache;

Get_Number();

ConCat();

GetChar();

if(ch=='&')

{

ConCat();

temp.key_name

temp.number=

}

else

{

retrace();

temp.key_name

temp.number=

}

=cache;

27;

=cache;

Get_Number();

 

else

{

if(ch=='|')

 

ConCat();

GetChar();

if(ch==T)

{

ConCat();

temp.key_name=cache;

temp.number=28;

else

retrace();

temp.key_name=cache;

temp.number=Get_Number();

 

}else

{

 

ConCat();

temp.key_name=cache;

temp.number=Get_Number();

}

}

}

六:

实验截图

(1)我测试的程序为v

oidmain()

{inta=20;

intb=15;

if(a==20)

printf("A");

if(b==20)

printf("B");

}

请输入源程序

bidfnain(j{int沪如;intb=15;

if(s==20)printf(7^"):

iE(b==20)printfrE^J;

}

助记符外部编码内部编码类型•

Qid

0

0

标识脣

main.

13

关矍字「

3i

E3qi

32

界符

[

33

界苻

ini

2

关键宇

a

0

1

标购

=

20

垣算付

20

1

0

常数

35

界符

mt

2

关键宝

b

0

2

标识符

*■Z"

Kil

=

20

產算付

15

1

1

常敎,

III

F

 

0

L5;

鬥;

n;

L助记符

外部漏码

内部编码

类型

if

E

C

31

畀苻

b

0

2

标识符

二二

21

史算付

20

1

C

常数

32

界付

priritf

11

31

畀苻

3T

界符

B

0

4

标识符

37

界付

32

畀符

1

35

畀苻

}

34

*

lllf

」卜

七:

实验心得

通过这次实验、我对于词法分析需要做的任务有了一个更加深刻的理解。

将课

本上的理论实践到实际上使我对课本有了很好的理解。

但是,这次实验中我也

发现了我很多的小

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

当前位置:首页 > IT计算机

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

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