编译原理》综合训练实习报告 本文关键词:编译,实习报告,原理,训练,综合
编译原理》综合训练实习报告 本文简介:附件二【学生用】西北农林科技大学信息工程学院《编译原理》综合训练实习报告小组成员姓名学号张浩宇2012013332黄彬2012013338郑瑞2012013343王冠2012013347姓名黄彬学号2012013338专业班级软件工程指导教师王美丽实践日期2014年6月30日-7月4日目录一、综合训
编译原理》综合训练实习报告 本文内容:
附件二
【学生用】
西北农林科技大学信息工程学院
《编译原理》综合训练实习报告
小组成员
姓
名
学
号
张浩宇
2012013332
黄彬
2012013338
郑瑞
2012013343
王冠
2012013347
姓名
黄彬
学号
2012013338
专业班级
软件工程
指导教师
王美丽
实践日期
2014年6月30日-7月4日
目
录
一、综合训练目的与要求1
二、综合训练任务描述1
三、编译系统设计1
五、调试与测试1
六、实习日志1
七、实习总结1
八、附录:核心代码清单1
一、综合训练目的与要求
本综合训练是软件工程专业重要的实践性环节之一,是在学生学习完《编译原理》课程后进行的综合练习。本课综合训练的目的和任务:
1.
巩固和加深学生对编译原理课程基本知识的理解和掌握;
2.
提高抽象思维能力以及加深理解编译系统的原理;
3.
掌握利用JavaCC开发编译系统的方法;
4.
掌握书写设计与实现编译系统说明文档的能力;
5.
提高综合运用算法、程序设计语言、数据结构知识的能力。
二、综合训练任务描述
根据组长的安排,我主要负责的任务是for循环语句的翻译,包括词法分析,语法分析和语义分析。
能够根据单词的构词规则,完成for语言中的单词的解析(词法分析),如果不符合单词的构词规则,请给出错误信息。如果源语言符合单词的词法规则,请输出二元式。
在词法分析的基础上,构造for的LL(1)文法,利用JavaCC实现LL(1)文法,判断源语言是否符合MiniC的语法,如果不符合,请给出语法错误信息。
在语法分析的基础上,根据属性文法制导翻译,进行语义分析,输出四元式。如果源语言不符合for的语义,请指出错误信息。
三、编译系统设计
(1)五大类的单词
关键字:由程序语言定义的具有固定意义的标识符。
标识符:用来表示各种名字,如变量、数组名、过程名等等。
常数:类型一般有整型,实型,布尔型等等。
运算符:如+、-、*、/等。
界符:如逗号,分号,括号,/*?*/等等
(2)
LL(1)文法的描述
LL(1)文法满足:
a、
文法不含左递归;
b、
对于文法中每一个非终结符的各个产生式的候选首符集两两不相交;
c、
对文法中的每一个非终结符A,若它存在某个候选首符集包含ε,则
FIRST(A)∩FOLLOW(A)=Φ
(3)
for语句语法
void
forstate()
:
{}
{
“(“(fuzhistate())?“;“(boolbiaodashi())?“;“(fuzhistate())?
“)“Expression_Blocks()
其中,fuzhistate()表示的是赋值语句,也就是for语句的初始化语句,如:i
=
0;boolbiaodashi()是表示for语句中的条件判断部分,条件为真则继续循环,为假则跳出循环,如:i
“(“(
fuzhistate()
{
quad
=
Snode.innerIdSeqen
+
1;
}
)?
“;“(
boolbiaodashi()
)?
“;“(
fuzhistate()
{
quad1
=
Snode.innerIdSeqen
+
1;
}
)?
“)“Expression_Blocks()
{
Slist.addSnode(new
Snode(“J“,“_“,“_“,quad));
Snode
backFill
=
Slist.get(jump
-
1);
String
nxq
=
““+
(Snode.innerIdSeqen
+
1);
backFill.setResult(nxq);
}
}
void
fuzhistate()
:
{
Token
f,node
=
null;
Token
m;
String
middle;
String
newTemp1,newTemp2;
int
D
=
0;
String
IDE
=
null;
String
s;
}
{
(
f
=
(“[“node
=
{
D++;
}
“]“)*
(
(
“=“middle
=
biaodashi()
{
qtTable.addSnode(new
Snode(“=“,middle,“_“,f.image));
}
)
|
(
(
{
qtTable.addSnode(new
Snode(“+“,f.image,“1“,f.image));
}
)
|
(
{
qtTable.addSnode(new
Snode(“-“,f.image,“1“,f.image));
}
)
)
)
{
IDE
=
f.image;
if
(!myNodeList.isExientence(IDE))
{
s
=
“变量“+
IDE
+
“未声明,错误“+
“/n“;
//
System.out.println(s);
S
+=
s;
s
=
null;
//System.exit(-
1);
}
}
)
|
(
m
=
f
=
{
qtTable.addSnode(new
Snode(“+“,f.image,“1“,f.image));
IDE
=
f.image;
if
(!myNodeList.isExientence(IDE))
{
s
=
“变量“+
IDE
+
“未声明,错误“+
“/n“;
//
System.out.println(s);
S
+=
s;
s
=
null;
//System.exit(-
1);
}
}
)
|
(
m
=
f
=
{
qtTable.addSnode(new
Snode(“-“,f.image,“1“,f.image));
IDE
=
f.image;
if
(!myNodeList.isExientence(IDE))
{
s
=
“变量“+
IDE
+
“未声明,错误“+
“/n“;
//
System.out.println(s);
S
+=
s;
s
=
null;
//System.exit(-
1);
}
}
)
}
void
boolbiaodashi()
:
{}
{
andboolbiaodashi()
(
andboolbiaodashi()
)*
}
void
andboolbiaodashi()
:
{}
{
notboolbiaodashi()
(
notboolbiaodashi()
)*
}
void
notboolbiaodashi()
:
{}
{
()?
guanxibiaodashi()
}
int
guanxibiaodashi()
:
{
String
node;
int
nxq;
String
first;
String
middle;
}
{
first
=
biaodashi()
(
node
=
guanxifu()
middle
=
biaodashi()
{
nxq
=
Snode.innerIdSeqen
+
1;
//
因为没有布尔运算,真出口已经确定
Slist.addSnode(new
Snode(“J“+
node,first,middle,nxq
+
2));
return
nxq
+
1;
//返回(j,_,_,0)的四元式标号
}
)?
}
String
guanxifu()
:
{
Token
t;
}
{
(
t
=
|
t
=
|
t
=
|
t
=
|
t
=
|
t
=
)
{
return
t.image;
}
}
String
biaodashi()
:
{
String
first;
String
middle;
String
newTemp;
}
{
first
=
term()
{
newTemp
=
first;
}
(
middle
=
term()
{
newTemp
=
VariableNameGenerator.genVariableName();
Slist.addSnode(new
Snode(“+“,first,middle,newTemp));
}
|
middle
=
term()
{
newTemp
=
VariableNameGenerator.genVariableName();
Slist.addSnode(new
Snode(“-“,first,middle,newTemp));
}
)*
{
return
newTemp;
}
}
String
term()
:
{
String
first;
String
middle;
String
newTemp;
}
{
first
=
unary()
{
newTemp
=
first;
}
(
middle
=
unary()
{
newTemp
=
VariableNameGenerator.genVariableName();
Slist.addSnode(new
Snode(“*“,first,middle,newTemp));
}
|
middle
=
unary()
{
newTemp
=
VariableNameGenerator.genVariableName();
Slist.addSnode(new
Snode(“/“,first,middle,newTemp));
}
)*
{
return
newTemp;
}
}
String
unary()
:
{
String
str;
Token
node;
String
IDE;
String
s
=
null;
}
{
node
=
{
return
node.image;
}
|
“(“str
=
biaodashi()
“)“{
return
str;
}
|
(
node
=
{
Slist.addSnode(new
Snode(“+“,node.image,“1“,node.image));
IDE
=
node.image;
if
(!myNodeList.isExientence(IDE))
{
s
=
“变量“+
IDE
+
“未声明,错误“+
“/n“;
S
+=
s;
s
=
null;
}
}
)
|
(
node
=
{
qtTable.addSnode(new
Snode(“-“,node.image,“1“,node.image));
IDE
=
node.image;
if
(!myNodeList.isExientence(IDE))
{
s
=
“变量“+
IDE
+
“未声明,错误“+
“/n“;
S
+=
s;
s
=
null;
}
}
)
|
(
LOOKAHEAD(2)
node
=
{
IDE
=
node.image;
if
(!myNodeList.isExientence(IDE))
{
s
=
“变量“+
IDE
+
“未声明,错误“+
“/n“;
S
+=
s;
s
=
null;
}
return
node.image;
}
|
(
node
=
(
“++“|
“--“)
{
IDE
=
node.image;
if
(!myNodeList.isExientence(IDE))
{
s
=
“变量“+
IDE
+
“未声明,错误“+
“/n“;
S
+=
s;
s
=
null;
}
}
)
)
}
12