编译原理实验报告二Word文件下载.docx
《编译原理实验报告二Word文件下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告二Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
7R→E>
=E
8R→E>
E
9R→E<
=E
10R→E<
E
11R→E==E
12R→E!
13R→E
14E→E+T
15E→T
16T→T*F
17T→F
18F→(E)
19F→n//数
20F→i//标识符
三、实验设计:
1、消除该文法的左递归(产生式1、3、14、16);
产生式
(1)L→L||A
(2)L→A
消除左递归得到:
L→AL'
L'
→||AL'
|з
产生式(3)A→A&
R(4)A→R
A→RA'
A'
→&
RA'
产生式(14)E→E+T(15)E→T
E→TE'
E'
→+TE'
产生式(16)T→T*F(17)T→F
T→FT'
T'
→*FT'
2、通过抽取公共左因子(产生式7~12),对该文法进行LL
(1)改造;
产生式7~12
抽取公共左因子:
R→ER'
R'
→>
=E|>
E|<
=E|<
E|==E|!
=E
3、证明最终得到的文法为LL
(1)文法。
对该文法进行LL
(1)改造的结果为:
(01)L→AL'
(02)L'
(03)A→RA'
(04)A'
(05)R→[L]|!
L|ER'
(06)R'
(07)E→TE'
(08)E'
(09)T→FT'
(10)T'
(11)F→(E)|n|i
LL
(1)文法的证明:
首先该文法无左递归存在,没有公共左因子。
该文法每个非终结符的FIRST无交集
产生式
FIRST
FOLLOW
L→AL'
{[,!
(,n,i}
{],#}
L'
→з
{||}
{з}
A→RA'
{||,],#}
A'
{&
}
R→[L]
→!
L
→ER'
{[}
{!
{(,n,i}
],#}
{>
=,>
<
=,<
==,!
=}
E→TE'
{(,n,i}
=,+,)}
E'
{+}
{з}
T→FT'
{*,+}
T'
{*}
F→(E)
→n
→i
{(}
{n}
{i}
则可以确定该文法是LL
(1)文法
文法相应的LL
(1)分析表如下:
(
)
n
i
+
*
[
]
>
=...
||
!
#
AL'
з
||AL'
A
RA'
R
ER'
[L]
=E...
E
TE'
+TE'
/з
T
FT
*FT'
F
(E)
四、源程序:
#include<
stdio.h>
#include<
stdlib.h>
string.h>
ctype.h>
conio.h>
voiderror();
voidterror();
voidScanner();
charsym='
'
;
inti=0;
charstrToken[30]={"
"
};
FILE*in;
voidL();
voidL1();
voidA();
voidA1();
voidR();
voidR1();
voidE();
voidE1();
voidT();
voidT1();
voidF();
voidRetract(charstr[30])
{
for(intj=0;
j<
30;
j++)
{
str[j]=0;
}
voidScanner()
sym=fgetc(in);
if(isspace(sym))
while
(1)
{
if(isspace(sym))
{
sym=fgetc(in);
}
elsebreak;
}
if(isdigit(sym))
if(isdigit(sym))
strToken[i]=sym;
i++;
else
printf("
%s"
strToken);
i=0;
Retract(strToken);
fseek(in,-2,1);
break;
}
else
if(sym=='
+'
printf("
+"
);
elseif(sym=='
-'
-"
*'
*"
elseif(sym=='
/'
/"
^'
^"
('
("
)'
)"
}
voidF()
Scanner();
E();
)
elseerror();
terror();
voidT1()
{
if(sym=='
{
F();
T();
voidT()
F();
T1();
voidE1()
E1();
voidE()
T();
E1();
voidL()
A();
L1();
L1()
A();
L1();
A()
R();
A1();
A1()
'
R();
A1();
R()
E();
R1();
['
L();
]'
R1()
='
||'
<
=='
voiderror()
{
printf("
Thisisthewrongphrase!
\n"
exit(0);
voidterror()
Thisisthewrongphrase2!
voidmain()
if((in=fopen("
input.txt"
"
r"
))==NULL)
printf("
THEFILEDOESN'
TOPEN!
"
exit(0);
Scanner();
L();
#'
\nsuccess\n"
else
fail"
fclose(in);
5、运行结果:
程序输入/输出示例:
输入如下表达式(以分号为结束)和输出结果:
(a)3>
5;
输出:
正确
(b)23>
=454;
(c)2*3>
=(2*3*4+3*3)&
[2>
3];
六、心得体会:
这次试验不仅要用到试验一的词法扫描器,还要先对文法进行LL
(1)改造和证明,还是挺困难的,做了很长时间。
大部分时间主要花在设计上,上课讲的很多东西都忘了,需要重新复习下才能开始做。
包括寻找FIRST和FOLLOW,以及构造分析表。
总之,这次试验让我收获很大。
也重新复习了一遍学过的知识。
我了解了语法分析器的内部工作原理,通过在本次实验中运用一定的编程技巧,掌握对表达式进行处理的一种方法,了解了也理解了递归下降分析法的基本原理。
指导教师批阅意见:
成绩评定:
指导教师签字:
年月日
备注:
注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。