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
」卜
七:
实验心得
通过这次实验、我对于词法分析需要做的任务有了一个更加深刻的理解。
将课
本上的理论实践到实际上使我对课本有了很好的理解。
但是,这次实验中我也
发现了我很多的小