当前位置:文档之家› 语义分析实验报告

语义分析实验报告

语义分析实验报告
语义分析实验报告

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

实验题目:语义分析

学院:信息学院

专业:计算机科学与技术

学号: 064

姓名:刘继远

目录

一、实验目的 ..................... 错误!未定义书签。

二、实验内容 ..................... 错误!未定义书签。

三、源程序分析 ................... 错误!未定义书签。

1、程序采用的BNF .............. 错误!未定义书签。

2、根据语义要求得到对应的翻译模式错误!未定义书

签。

3、实现原理 ................... 错误!未定义书签。

4、文法的属性分析 ............. 错误!未定义书签。

5、过程设计 ................... 错误!未定义书签。

6、子程序说明 ................. 错误!未定义书签。

四、设计的基本思想(包括修改之后的属性文法、属性类型分析、翻译模式) ................. 错误!未定义书签。

1、增加除法运算 ............... 错误!未定义书签。

2、禁止同名重复声明 ........... 错误!未定义书签。

五、结果及分析 ................... 错误!未定义书签。

一、实验目的

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

二、实验内容

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

非终结符号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 { := int } | real L { := real }

L→ id { := enter, }A

A→ ,idA { := enter,}

A→ε

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

H→;S | ε

E→T { :=} R {:=}

R→+T { := newtemp; gen( "+", , , } R {:= ; } R→ ε {Rs=}

T→F { :=} P { :=}

P→* F { := newtemp; gen( "*", , , T) } P {:= ; } P→ε {=}

F→( E ) { := }

F→id {:=position (id)}

V→id {:=position(id)}

3、实现原理

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

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

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

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

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

(1)对终结符 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(); ame) == 0){

printf("错误4:变量名重复.\n");

exit(0);

}

}

每次要把一个变量加入到table[tx]数组中都要检验变量名是否跟table[tx]数组中已有的变量名重复,重复就报错,并跳出程序。

这样就在程序中增加了检查重复变量名的功能。

五、结果及分析

1、运行的文件内容为:

real a,b;

int c,d;

c:=c+d*b;

d:=b*a.

运行结果为:

2、运行文件的内容为:

real a,b;

int c,d,a;

c:=c+d*b;

d:=b*a.

运行结果为:

3、运行文件的内容为:

real a,b;

int c,d;

f:=c+d*b;

d:=b*a.

运行的结果为:

从以上三个结果(一个正确,两个错误)来看,完全实现了扩展要求的两个功能,也完全符合定义的语法语义规则。

相关主题
文本预览
相关文档 最新文档