语义分析实验报告

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

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

实验题目:语义分析

学院:信息学院

专业:计算机科学与技术

学号: 20091060064

姓名:刘继远

目录

一、实验目的 0

二、实验内容 0

三、源程序分析 (2)

1、程序采用的BNF (2)

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

3、实现原理 (4)

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

5、过程设计 (5)

6、子程序说明 (6)

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

1、增加除法运算 (7)

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();

相关文档
最新文档