语义分析实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
云南大学编译原理实验报告
实验题目:语义分析
学院:信息学院
专业:计算机科学与技术
学号: 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]数组中已有的变量名重复,重复就报错,并跳出程序。