语义分析实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

云南大学编译原理实验报告

实验题目:语义分析

学院:信息学院

专业:计算机科学与技术

学号:20091060064

姓名:刘继远

目录

一、实验目的 (1)

二、实验内容 (1)

三、源程序分析 (2)

1、程序采用的BNF (2)

2、根据语义要求得到对应的翻译模式 (3)

3、实现原理 (4)

4、文法的属性分析 (4)

5、过程设计 (5)

6、子程序说明 (6)

四、设计的基本思想(包括修改之后的属性文法、属性类型分析、翻译模式) (6)

1、增加除法运算 (6)

2、禁止同名重复声明 (8)

五、结果及分析 (8)

一、实验目的

进一步理解递归下降分析原理和实现方法,理解语义分析的基本机制,掌握语义子程序的构造方法。

二、实验内容

将带变量声明的表达式翻译为四元式序列,其中包括以下要求:

●非终结符号D实现定义两种类型int, real变量的声明;

●非终结符号S实现变量之间的*,+,: =(赋值运算)

●两个关键字int 和real

●变量之间的*,+,: =(赋值) 运算只能使用声明过的变量,所以要检查

使用的变量是否声明过。

●对每个*,+,: =(赋值) 运算生成一条四元式如(*,A,B,T1),其

中T1是临时变量

●*优先级别高于+,*满足左结合规则

三、源程序分析

这是一个简单的包含词法、语法、语义分析的程序:语义分析.h和语义分析.cpp。实现的基本原理是自顶向下分析,单遍扫描,以语法分析为核心,调用词法分析,并实现语义分析。

1、程序采用的BNF

P→ DS.

D→B; D

D→ε

B→int L | real L

L→id | L,id

S→ V := E H

H→;S | ε

E→E+T | T

T→T*F|F

F→( E )

F→id

V→id

消除左递归之后的等价文法

start→ DS.

D→B; D

D→ε

B→int L | real L

L→id A

A→ ,idA

A→ε

S→ V := E H

H→;S | ε

E→T R

R→+T R

R→ ε

T→F P

P→* F P

P→ε

F→( E )

F→id

V→id

2、根据语义要求得到对应的翻译模式

start→ DS.

D→ B; D

D→ε

B→ int L { L.type := int } | real L { L.type := real }

L→ id { A.Type := L.type enter(v.entry, L.type)}A

A→ ,idA { A1.Type := A.type enter(v.entry,A.type)}

A→ε

S→ V := E { gen( ":=", E.place,0,V.place) } H

H→;S | ε

E→T { R.i:=T.place} R {E.place:=R.s}

R→+T { R1.i:= newtemp; gen( "+", R.i, T.place , R1.i) } R {R.s:= R1.s; }

R→ ε {Rs=R.i}

T→F { P.i:=F.place} P { T.place:=P.s}

P→* F { p1.i:= newtemp; gen( "*", P.i, F.place , T) } P {P.s:= p1.s; }

P→ε {P.s=P.i}

F→( E ) { F.place := E.place}

F→id {F.place:=position (id)}

V→id {V.place:=position(id)}

3、实现原理

基于翻译模式的自上而下语义处理(翻译)

1.对每个非终结符A,构造一个函数,以A 的每个继承属性为形参,以A的

综合属性为返回值(若有多个综合属性,可返回记录类型的值)。如同预测分析程序的构造,该函数代码的流程是根据当前的输入符号来决定调用哪个产生式。

2.与每个产生式相关的代码根据产生式右端的终结符,非终结符,和语义规则

集(语义动作),依从左到右的次序完成下列工作:

(1)对终结符X,保存其综合属性x的值至专为X.x 而声明的变量;然

后调用匹配终结符(match_token)和取下一输入符号(next_token)

的函数;

(2)对非终结符B,利用相应于B 的函数调用产生赋值语句c:=B(b1,

b2, …, bk),其中变量b1, b2, …, bk 对应B的各继承属性,变量c

对应B的综合属性

(3)对语义规则集,直接copy其中每一语义规则(动作)来产生代码,

只是将对属性的访问替换为对相应变量的访问。

4、文法的属性分析

5、过程设计

int getsym(); //读一个单词

void enter(enum symbol type); //登记符号表

void init();

int position(char* idt); //查询符号表用函数,返回在符号表中位置int gen(enum symbol op, int arg1, int agr2,int result ); //生成四元式void newtemp()//申请临时变量

void start();

void D();

void B();

void L(enum symbol type);

void A(enum symbol type);

void S();

void H();

int E();

int R(int Ri);

int T();

int P(int pi);

int F();

int V();

相关文档
最新文档