好好学习,天天向上,一流范文网欢迎您!
当前位置:首页 >> 最新范文 内容页

编译原理》综合训练实习报告

编译原理》综合训练实习报告 本文关键词:编译,实习报告,原理,训练,综合

编译原理》综合训练实习报告 本文简介:附件二【学生用】西北农林科技大学信息工程学院《编译原理》综合训练实习报告小组成员姓名学号张浩宇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

TAG标签: