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

语义分析实验报告

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

实验题目:语义分析

学院:信息学院

专业:计算机科学与技术

学号: 064

姓名:刘继远

目录

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

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

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

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

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

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

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

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

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

一、实验目的

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

二、实验内容

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

非终结符号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.

运行的结果为:

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

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