编译原理实验报告二.docx
《编译原理实验报告二.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告二.docx(13页珍藏版)》请在冰点文库上搜索。
编译原理实验报告二
深圳大学实验报告
课程名称:
编译原理
实验项目名称:
语法分析--递归下降法
学院:
计算机与软件
专业:
软件工程
指导教师:
张小建
报告人:
文成学号:
2011150259班级:
2
实验时间:
2013-12-25
实验报告提交时间:
2013-12-26
教务部制
一、实验目的:
掌握自顶向下的语法分析法——递归下降法。
二、实验内容:
用递归下降法对如下所定义的逻辑表达式进行语法分析。
1L→L||A
2L→A
3A→A&&R
4A→R
5R→[L]
6R→!
L
7R→E>=E
8R→E>E
9R→E<=E
10R→E11R→E==E
12R→E!
=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
7R→E>=E
8R→E>E
9R→E<=E
10R→E11R→E==E
12R→E!
=E
抽取公共左因子:
R→ER'
R'→>=E|>E|<=E|=E
3、证明最终得到的文法为LL
(1)文法。
对该文法进行LL
(1)改造的结果为:
(01)L→AL'
(02)L'→||AL'|з
(03)A→RA'
(04)A'→&&RA'|з
(05)R→[L]|!
L|ER'
(06)R'→>=E|>E|<=E|=E
(07)E→TE'
(08)E'→+TE'|з
(09)T→FT'
(10)T'→*FT'|з
(11)F→(E)|n|i
LL
(1)文法的证明:
①首先该文法无左递归存在,没有公共左因子。
②该文法每个非终结符的FIRST无交集
产生式
FIRST
FOLLOW
L→AL'
{[,!
(,n,i}
{],#}
L'→||AL'
→з
{||}
{з}
{],#}
A→RA'
{[,!
(,n,i}
{||,],#}
A'→&&RA'
→з
{&&}
{з}
{||,],#}
R→[L]
→!
L
→ER'
{[}
{!
}
{(,n,i}
{&&,],#}
R'→>=E|>E|<=E|=E
{>=,>,<=,<,==,!
=}
{&&,],#}
E→TE'
{(,n,i}
{>=,>,<=,<,==,!
=,+,)}
E'→+TE'
→з
{+}
{з}
{>=,>,<=,<,==,!
=,+,)}
T→FT'
{(,n,i}
{*,+}
T'→*FT'
→з
{*}
{з}
{*,+}
F→(E)
→n
→i
{(}
{n}
{i}
{*}
③则可以确定该文法是LL
(1)文法
文法相应的LL
(1)分析表如下:
(
)
n
i
+
*
[
]
>=...
&&
||
!
#
L
AL'
AL'
AL'
AL'
AL'
L'
з
||AL'
з
A
RA'
RA'
RA'
RA'
RA'
A'
з
&&RA'
з
з
R
ER'
ER'
ER'
[L]
!
L
R'
>=E...
E
TE'
TE'
TE'
E'
з
+TE'/з
з
T
FT
FT
FT
T'
з
*FT'/з
F
(E)
n
i
四、源程序:
#include
#include
#include
#include
#include
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))
{
while
(1)
{
if(isdigit(sym))
{
strToken[i]=sym;
i++;
sym=fgetc(in);
}
else
{
printf("%s",strToken);
i=0;
Retract(strToken);
fseek(in,-2,1);
sym=fgetc(in);
break;
}
}
}
else
{
if(sym=='+')
printf("+");
elseif(sym=='-')
printf("-");
elseif(sym=='*')
printf("*");
elseif(sym=='/')
printf("/");
elseif(sym=='^')
printf("^");
elseif(sym=='(')
printf("(");
elseif(sym==')')
printf(")");
}
}
voidF()
{
if(isdigit(sym))
Scanner();
elseif(sym=='(')
{
Scanner();
E();
if(sym==')')
Scanner();
elseerror();
}
else
terror();
}
voidT1()
{
if(sym=='*')
{
Scanner();
F();
T();
}
}
voidT()
{
F();
T1();
}
voidE1()
{
if(sym=='+')
{
Scanner();
T();
E1();
}
}
voidE()
{
T();
E1();
}
voidL()
{
A();
L1();
}
L1()
{
if(sym=='+')
{
Scanner();
A();
L1();
}
}
A()
{
R();
A1();
}
A1()
{
if(sym=='&&')
{
Scanner();
R();
A1();
}
}
R()
{
E();
R1();
if(sym=='[')
{
Scanner();
L();
if(sym==']')
Scanner();
}
if(sym=='!
')
{
Scanner();
L();
}
}
R1()
{
if(sym=='>='||'>'||'<='||'<'||'=='||'!
=')
{
Scanner();
E();
}
}
voiderror()
{
printf("Thisisthewrongphrase!
\n");
exit(0);
}
voidterror()
{
printf("Thisisthewrongphrase2!
\n");
exit(0);
}
voidmain()
{
if((in=fopen("input.txt","r"))==NULL)
{
printf("THEFILEDOESN'TOPEN!
");
exit(0);
}
Scanner();
L();
if(sym=='#')
printf("\nsuccess\n");
else
printf("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日内。