词法分析实验报告实验一.docx
《词法分析实验报告实验一.docx》由会员分享,可在线阅读,更多相关《词法分析实验报告实验一.docx(19页珍藏版)》请在冰点文库上搜索。
词法分析实验报告实验一
编译原理词法分析实验报告
软工082班
兰洁
200831104044
一、实验内容
二、实验目的
三、实验预期
四、程序规定
五、实验原理
•程序流程图
•判别浮点功能扩展流程图
•状态转换图
六、程序代码与浮点判别功能扩展
七、测试用例
•扩展功能测试用例;
•普通功能测试用例
八、输出结果
九、实验心得
一、实验内容:
词法分析:
1、识别简单语言的单词符号;
2、识别关键字、标识符、数字、运算符等。
并扩展浮点识别功能。
二、实验目的
调试词法分析程序,加深对词法分析原理的理解,掌握编写简单词法分析程序的一般步骤。
三、实验预期结果:
经过调试源代码程序,程序能够成功运行编译,对输入的简单字符串,能够别关键字、
标识符、数字、运算符等,并且给岀单词符号的对应编码。
四、程序规定:
1、天键子:
function,if,then,while,do,endfunc:
2、算术运算符:
”+”,"-”,”*”,”/”,”二”:
3、关系运算符:
4、界符:
"(""、”甘;
5、标识符规泄以字母开头,字母均为小写;
6、空格和换行符跳过:
7、单词对应编码:
单词符号
对应编码
单词符号
对应编码
单词符号
对应编码
function
1
>
23
==
25
if
2
<
20
!
二
29
then
3
+
13
26
while
4
—
14
(
27
do
5
*
15
)
28
endfunc
6
/
16
<>
21
标识符
10
>=
24
其他
-1
数字
11
<=
22
浮点数
80
#
0
二
18
十、实验原理:
输入串〉词法分析程序〉单词符号串
输入:
字符串以#结朿。
输出:
单词的二元组(syn,token/sum)
十•―卜••••卜■r
«-・r
9•■■・'•V•♦■■'•:
■/®Y:
■/:
9J•/■
■■•・■
■••r■7:
■/■/Y:
・<"T•T•~■
■••aa
I
n・n
p・*・4*・》・i*・》W・l
•-T-T-VT-v-r•:
r-r-r-t-r-r
十十
「・:
••厂
炉呃砧他郴匏®4
..
"iWs
I■+
■•••»gF・■
・・・•■■・・•・・・・
••仪
■••PF
•»w»吋w»
II••a
厂厂丁
t-i---
r-t-
十匸
.十十
•r-r-:
-r*
瞑4丄解廊
»•••#•
»•••#•
r-t
r-r-r-t-:
-
H
•lZ
-«
f......T.:
、
r-t-
n
—;
r-T....r.-
F-4--
--4-4---
4
…"卄!
••;•;」丄…
ir—-4-vr—
irl^lJ.!
rI
L卜
删卿昨S
十卜+
1••••>•••••!
••!
•••••!
••I、•:
•!
:
•:
••l4—:
•十
Lt~
人一^
p・£・・p•号•£••,・£••》•■•£••》•£•
r-4-~
••J•••
)••••・•••
I|:
I:
r-r-;r.iI;i;Lf~-r~
r-T....f-.
>I:
•:
••严•••
••<・•••••••・■・
I:
II:
I:
II:
I:
II
•••»J»»fi»•••广
/••••/•▼•••
厂叮
厂■•叮
>••••>・{*・;
f••••/•▼•••
/•r**°
•••■•
开始
sumint^O;n=O仪Y
sumint-sumint*10+sunil[n]・O:
nT:
4〃计算整数部分
Syn=lI;
suml[k]-ch;ch二prog[++c];
将数字放Buml这个数
组里
r-i
•
•
:
.1••:
ch=nrop
4cl:
g・■■
•■■••••••
■Ct”
Jtcnshu[i]-ch;
i++;
4~N—<
—
••1•
•
・•••••••
..U.J
1•
...
I•-•
*
••—r*・.・・
•;1•
••■・・Y・・•,•••・•
•:
f•
1••
•••
•1
•I
•・•
调用血呵)函数,用来
判斯浮点数的小数部分
是否充全玻进i&shu这
个数组中
sumf=sumf^0.1+(fenshu[k』卜⑪)检1;竹I•算小数部分
■厂
Syn-80?
N-WsumM):
k=i-2
{・•:
••■•••••・••••••:
1•.•s
•I..:
..;.
••
■・•:
vr•
B
1■9»
、Syn80/>>
调用shU2i()凶埶用来判断浮点数的整数部分是否克全放进suml这个数组巾
X——-fudian-sumini+bumE浮点数计算syn=80;
状态转换图
六.程序代码:
/*词法分析源代码柠
#include#include
scaner0;
charprog[80_,token[8」;
charch;
intsyn,p,m,n,sum;
char*rwtab16]={,zfunction"*,"辻"then","while","do","endfunc"};
mainO
{p二0;
printf(z,\npleaseinputstring:
\n");
do{
scanf(,z%c,z,&ch);
prog[++pj=ch;}
while(ch!
二'#');
P二0;
do
{
scaner0;
switch(syn)
//ch取后一个数字
;//这个函数用来分析浮点数的整数部分是否
已经输入到数组里
〃计算整数部分
〃这个函数用来分析浮点数的小数部分是否已经输入到数组里
//计算浮点数的小数部分
〃浮点数计算
//若是整数,ch等于原来的值
else
switch(ch)case*:
m=0;
token[m++]=ch;ch=progL++p];
辻(ch二二'二')
{syn=22;
token[m++]=ch;
}
else
if(ch='>')
{
syn=21;
token[m++]二ch;
}
else
{syn=20;ch=prog[―p]:
}break;
case*>':
m=0;
token[m++]=ch;
ch二prog[++p];
辻(ch二二'二')
{syn=24;
token=ch;
}
else
{syn=23;
ch=prog[―p];
}
break;
case*:
m=0;
token[m++]=ch;ch=progL++p];
if(ch二二'二')
{syn=25;
tokenLm++]=ch;
}
else
{syn=18;
ch二prog-―p];
}
break;
case*!
':
m^O:
token[m++]=ch;
ch二prog[++p];
辻(ch二二'二')
{syn=22;
token[m++]二ch;
}
else
{
syn=-l;
P—;
}
break;
case*+':
syn=13;token[0]=ch;break:
case*:
syn=14;tokenEO]=ch:
break:
case**':
syn=15;token[0]=ch:
break:
case*/':
syn=16;tokenEO]=ch;break:
case*:
syn=26;token[0]=ch:
break:
case*(':
syn=27;tokenEO]=ch:
break:
case*)':
syn=28;tokenEO]=ch:
break:
case*:
syn=0;token[0]=ch:
break:
default:
syn=-l;
}
}
七.测试用例^
测试用例1
输岀结果
测试用例2
输出结果
测试用例3
输出结果
1+1=2;#
(11,1)
a*b=c;
(10,a)
function
(1,function)
(13,+)
c=l+s2b;
(15,*)
while(a=l)
(4,wh订e)
(11,1)
(10,b)
if(sb>=2)
(27,0
(1&=)
(1&二)
2=s2b;
(10,a)
(11,2)
(10,c)
endfunc
(1&=)
(26,;)
(26,;)
#
(11,1)
(0,#)
(10,c)
(28,))
测试用例4
输岀结果
(1&二)
(2,if)
error
(11,1)
(27,0
~!
@$好&_#
error
(13,+)
(10,sb)
error
(10,s2b)
(24,>=)
error
(26,;)
(11,2)
error
(0,#)
(28,))
error
(11,2)
error
(18,=)
error
(10,s2b)
error
(26,;)
(0,#)
(6,endfunc)
(0,#)
输入数据1
显示结果
输入数据
显示结果
输入数据
显示结果
a+b=l.1;
(10,a)
a=l+2.2
(10,a)
a=l*2.3;
(10,a)
a=2.3#
(13,+)
b=3・2;
(18,=)
2*12.2=24.4#
(18,=)
(10,b)
1+2.3=3.3#
(11,1)
(11,1)
(18,=)
(13,+)
(15,*)
(80,1.100000)
(80,2.200000)
(80,2.300000)
(26,;)
(10,b)
(26,;)
(10,a)
(18,=)
(11,2)
(18,=)
(80,3.200000)
(15,♦)
(80,2.300000)
(26,;)
(80,12.200000)
(0,#)
(11,1)
(18,=)
(13,+)
(80,24.400000)
(80,2.300000)
(18,=)
(80,3.300000)
(o,n)
(o,#)
八、程序输出结果:
-MH:
«译原理\代码记事丰Qebug词法分祈涯代码(wanchenflJ.exB
pieaseinput:
stfingr=a*b=l.±;
卜=2・3tt
<10.a>
<13.*>
<10.b>
<18.=>
<80.1・丄0000
<26.;>
<10.a>
<18.=>
<80.2・300000A
<0,IDPressanyketocontinue
|/・H:
晦译原锂'代玛记爭本\Debum词法分靳潭代码佃anulwng)・aca・
plea.se±npci七:
&七i*in^-
耳=1+2.2
b=3.2;
1*2.3=3.3#
<10.a>
<18,=>
<11.1>
<13,+>
<80,2.200000>
<10,b)
<18,=)
<80,3.200000>
<26,;)
<11,1)
<13,+)
<80,2.300000><18,=>
<80^3.300000>
<0^.tt>Pressctnj/keytoconi:
inue
“"H:
炉译原理玛左l事本gebug阖法分折灌代码tvuanulwngheKe"
pledase:
inputst:
tiding
L=l*2-3;
2*±2.2=24.4#<10,
<18,=>
<11,1>
<15,*)<80,2-300000>
;〉
<11,2)<15,*>
<80,12.260003><18,=>
<80,24.400000)<0,.lt>Pi:
*essa.nykeytoconf:
inLie
普通功能测试用例显示结果
九、实验心得
通过编译原理实验一词法分析实验,使得自己对词法分析的流程有了更深刻的了解,虽然源代码并非由自己设讣,但是在调试程序的过程中,尤其是进行测序功能扩展的过程中,想了很多种办法,终于找到了最合适的方法,而且还进行了代码的优化,这个过程虽然有时有些枯燥,但是更多时候是欣喜的,不仅复习了C语言的许多内容,并且有了更深的理解。
很好的理解了程序的思想,理淸了词法分析程序的思路。
从一开始对程序的陌生,到后来逐步了解程序的流程,当我耐心的一步一步理解程序思想,一次次的更改测试用例,一迪遍的调试,最终终于得到了预期的答案。
这次实验使我对理论的词法分析的理解更加具体淸晰,收获很大。