实验一词法分析Word文件下载.docx

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

实验一词法分析Word文件下载.docx

《实验一词法分析Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验一词法分析Word文件下载.docx(19页珍藏版)》请在冰点文库上搜索。

实验一词法分析Word文件下载.docx

12

13

14

15

16

17

18

19

20

printf

return

main

read

+

*

/

%

=

21

22

23

24

25

26

27

28

29

30

==

>

<

&

||

!

31

32

33

34

35

36

37

38

39

40

{

}

++

--

三:

主流程图如下:

四:

实验思路

(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

publicpartialclassForm1:

Form

{

publicForm1()

InitializeComponent();

}

char[]receive;

//从输入得到的源程序

charch;

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

stringcache;

//暂存的单词

intindex;

//记录取到哪个位置了

key_wordtemp;

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

structkey_word

publicstringkey_name;

publicintnumber;

structnum_word

publicstringnum_name;

structID_word

publicstringID_name;

publicintnum_index;

publicintID_index;

DataTabledt;

privatevoidbutton1_Click(objectsender,EventArgse)

dt=newDataTable();

dt.Columns.Add("

助记符"

);

外部编码"

内部编码"

类型"

receive=textBox1.Text.ToCharArray();

index=0;

num_index=0;

ID_index=0;

;

while(index<

receive.Length)

cache=null;

Get_Word();

if(temp.number==1)

inti=0;

intflag=0;

if(num_index==0)

Num[num_index].num_name=temp.key_name;

Num[num_index].number=num_index;

num_index++;

else

for(i=0;

i<

num_index;

i++)

if(Num[i].num_name==temp.key_name)

flag=i;

break;

if(i>

=num_index)

flag=num_index;

DataRowdr=dt.NewRow();

dt.Rows.Add(dr);

dr["

]=temp.key_name;

]=temp.number;

]=+Num[flag].number;

]="

常数"

elseif(temp.number==0)

if(ID_index==0)

ID[ID_index].ID_name=temp.key_name;

ID[ID_index].number=ID_index;

ID_index++;

ID_index;

if(ID[i].ID_name==temp.key_name)

=ID_index)

flag=ID_index;

]=ID[flag].number;

标识符"

if(temp.number>

=15&

temp.number<

=30)

运算符"

elseif(temp.number>

=31&

=40)

界符"

关键字"

this.dataGridView1.DataSource=dt;

key_word[]Key;

num_word[]Num;

ID_word[]ID;

privatevoidForm1_Load(objectsender,EventArgse)

Key=newkey_word[41];

Key[0].key_name="

$ID"

Key[0].number=0;

//标识符

Key[1].key_name="

$INT"

Key[1].number=1;

//数

Key[2].key_name="

int"

Key[2].number=2;

Key[3].key_name="

float"

Key[3].number=3;

Key[4].key_name="

void"

Key[4].number=4;

Key[5].key_name="

const"

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_name="

%"

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[index];

index++;

ch='

\0'

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

if(ch!

='

'

&

ch!

\r'

\n'

publicvoidConCat()//连接

cache+=ch;

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

if(ch>

A'

ch<

Z'

||ch>

a'

z'

returntrue;

returnfalse;

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

0'

9'

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

for(inti=0;

41;

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

returnKey[i].number;

return0;

publicvoidretrace()//退回一个单词

index--;

privatevoidGet_Word()

intcount;

GetNotKong();

ConCat();

GetChar();

while(IsLetter()||IsDigit())

retrace();

count=Get_Number();

temp.key_name=cache;

if(count==0)

temp.number=0;

temp.number=Key[count].number;

elseif(ch>

while(IsDigit())

temp.number=1;

elseif(ch=='

+'

if(ch=='

temp.number=39;

temp.number=Get_Number();

-'

temp.number=40;

='

temp.number=26;

temp.number=25;

temp.number=21;

temp.number=24;

temp.number=27;

|'

temp.number=28;

六:

实验截图

(1)我测试的程序为v

oidmain()

{inta=20;

intb=15;

if(a==20)

printf("

A"

if(b==20)

B"

 

七:

实验心得

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

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

但是,这次实验中我也发现了我很多的小缺点,这个实验也挺考验一个学生的分析能力的。

因为这个实验需要做的判断是非常多的、稍微漏掉一点就有可能导致整个程序的错误。

而且、开始的时候我还把实验给理解错了。

这让我更加知道了做实验之前好好分析的重要性。

因为如果连要求都没有搞明白就去做实验的话。

带来的麻烦更多。

今后一定多加注意。

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

当前位置:首页 > 小学教育 > 语文

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

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