编译原理》综合训练实习报告Word文档下载推荐.docx
- 文档编号:1516614
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:20
- 大小:99.73KB
编译原理》综合训练实习报告Word文档下载推荐.docx
《编译原理》综合训练实习报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编译原理》综合训练实习报告Word文档下载推荐.docx(20页珍藏版)》请在冰点文库上搜索。
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语句语法
voidforstate():
{}
{
<
FOR>
"
("
(fuzhistate())?
"
;
(boolbiaodashi())?
)"
Expression_Blocks()
其中,fuzhistate()表示的是赋值语句,也就是for语句的初始化语句,如:
i=0;
boolbiaodashi()是表示for语句中的条件判断部分,条件为真则继续循环,为假则跳出循环,如:
i<
N;
最后的部分是执行部分,就是当循环成功执行后所伴随的执行,实际上也是一个赋值语句,所以这里用了fuzhistate(),比如说,i++,实际上就是i=i+1。
后面跟?
号是表示赋值语句部分可以是空的,for(;
;
)的空循环就是这样的。
最后,就是for语句的循环主体,也就是个语句块,其中也可以嵌套各种的语句,包括for本身。
四、调试与测试
如下是调试过程。
图1
图1是简单的测试用例,在主函数main()中两个for语句的嵌套。
图2
图2是上面测试用例的词法分析,如图所示,最前面的序号表示的是输出序号,尖括号中有两部分,第一部分是词法分析分解出来的单词或符号,而剩下部分是对应单词或符号的种别码,每一种单词或符号都有其自己的种类码。
就拿常数来说,如,10,0,20等都是常数,他们的种别码都是49。
图3
图3是相应的for循环的语句的语法树的输出。
图4
图4是相应的for循环语义分析中的四元式输出。
五、实习日志
实习日期:
2014-6-30
主要任务:
for语句的语法分析,完成部分词法分析。
完成情况:
在稿纸上写出了for语句的上下无关文法,添加了关键字的词法分析,标示符的词法分析,数字(也就是常数)词法分析。
实习收获:
进一步学习了编译原理的知识,加深对文法的理解。
2014-7-1
完成for语句的语法分析
通过javacc完成了for语句的大部分的语法分析,实现输出。
加深对javacc开发编译器的理解,掌握一些开发技巧。
2014-7-2
完善语法分析的部分,并开始语义分析的初步开发。
完善了语法分析阶段的一些小问题,如调试阶段出现的问题,并对for语句的四元式进行的分析,理清其中的结构和跳转点。
加强了对四元式的理解,将理论的四元式通过代码实现出来了。
2014-7-3
完成for语句的语义分析部分。
完成了对for语句的语义分析,输出相应的四元式列表。
对于for循环的跳转点的把握更加准确了,调理清晰。
2014-7-4
完成实习论文的撰写和展示ppt的设计。
部分论文撰写完成了,ppt也完成了。
论文设计和撰写仍然需要花心思和时间。
六、实习总结
通过本次javacc开发MiniC的实习,我们对编译原理课程基本知识的理解和掌握得到了巩固和加深,特比是LL
(1)文法的理解,抽象思维能力得到了提高以及编译系统的原理也得到了加深理解;
除此之外,我们也掌握利用JavaCC开发编译系统的方法;
提高综合运用算法、程序设计语言、数据结构知识的能力。
这也从另一个方面反映了我们自身在编写代码开发方面所欠缺的东西特别多,需要学习和提高的方面还有很多。
在实践中学习,也要将学习应用到实践中。
七、附录:
核心代码清单
我的部分核心代码:
intjump=0,jump1=0;
intquad=0;
intquad1=0;
}
(
fuzhistate()
{
quad=Snode.innerIdSeqen+1;
}
)?
boolbiaodashi()
quad1=Snode.innerIdSeqen+1;
Slist.addSnode(newSnode("
J"
"
_"
quad));
SnodebackFill=Slist.get(jump-1);
Stringnxq="
+(Snode.innerIdSeqen+1);
backFill.setResult(nxq);
voidfuzhistate():
Tokenf,node=null;
Tokenm;
Stringmiddle;
StringnewTemp1,newTemp2;
intD=0;
StringIDE=null;
Strings;
f=<
ID>
("
["
node=<
CONSTANT>
D++;
]"
)*
="
middle=biaodashi()
qtTable.addSnode(newSnode("
middle,"
f.image));
)
|
zizeng>
+"
f.image,"
1"
zijian>
-"
IDE=f.image;
if(!
myNodeList.isExientence(IDE))
s="
变量"
+IDE+"
未声明,错误"
+"
\n"
//System.out.println(s);
S+=s;
s=null;
//System.exit(-1);
|
m=<
voidboolbiaodashi():
andboolbiaodashi()
OR>
)*
voidandboolbiaodashi():
notboolbiaodashi()
AND>
voidnotboolbiaodashi():
(<
NOT>
)?
guanxibiaodashi()
intguanxibiaodashi():
Stringnode;
intnxq;
Stringfirst;
first=biaodashi()
node=guanxifu()middle=biaodashi()
nxq=Snode.innerIdSeqen+1;
//因为没有布尔运算,真出口已经确定
+node,first,middle,nxq+2));
returnnxq+1;
//返回(j,_,_,0)的四元式标号
Stringguanxifu():
Tokent;
t=<
XIAOYU>
|t=<
XIAOYUDENGYU>
DAYU>
DAYUDENGYU>
DENGYUDENGYU>
BUDENGYU>
returnt.image;
Stringbiaodashi():
StringnewTemp;
first=term()
newTemp=first;
PLUS>
middle=term()
newTemp=VariableNameGenerator.genVariableName();
first,middle,newTemp));
|<
MINUS>
returnnewTemp;
Stringterm():
first=unary()
MULTIPLY>
middle=unary()
*"
DIVIDE>
/"
Stringunary():
Stringstr;
Tokennode;
StringIDE;
Strings=null;
returnnode.image;
|"
str=biaodashi()"
returnstr;
node.image,"
node.image));
IDE=node.image;
LOOKAHEAD
(2)
++"
|"
--"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 综合 训练 实习 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)