赞
踩
语义分析也称为类型检查,上下文相关分析
负责检查程序(抽象语法树)的上下文相关的属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YX2SxtEw-1642042136401)(…/picture/12.png)]
用来存储程序中的符号(标识符)相关属性信息,是进行上下文语义合法性检查的依据。
类型
作用域
访问控制信息
目标代码生成阶段:符号表是对符号名进行地址分配的依据。
变量符号由它被定义的存储类别和被定义的位置等来确定将来被分配的存储位置
符号表的实现方式:哈希表:查找 O ( 1 ) O(1) O(1),平衡树:节约空间,查找 O ( log N ) O(\log N) O(logN)
创建符号表的时间:至少在静态语义分析之前创建
符号表处理作用域:一张表的方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I1WyJVLL-1642042136405)(…/picture/13.png)]
采用符号表构成的栈:
进入作用域时,插入新的符号表
退出作用域时,删除栈顶符号表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BtBSHNk3-1642042136406)(…/picture/14.png)]
检查程序结构(控制结构和数据结构)的一致性或完整性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3wJvKWKj-1642042136407)(…/picture/15.png)]
现代的编译器中的语义分析,除了语义分析外,还要负责生成中间代码或目标代码
语义规则:给出了属性计算的定义,没有属性计算的次序等实现细节
翻译模式:适合语法制导语义计算的另一种描述形式(给出使用语义规则进行计算的次序,把实现细节表示出来)
形式上类似于属性文法,但允许由 { } \{\} {}括起来的语义动作出现在产生式右端的任何位置,以此显示的表达属性计算的次序。
当只需要综合属性时:为每一个语义规则建立一个包含赋值的动作,并把这个动作放在相应的产生式右边的末尾。
既有综合属性又有继承属性:
仅含有综合属性
是一种仅涉及综合属性的情形,通常将语义动作集合置于相应产生式右端的末尾。
一般基于自顶向上分析(如 L R LR LR分析)过程,通过增加存放属性值域的语义栈来实现
若假设语义栈由向量 v v v表示,归约前栈顶的位置为 t o p top top,栈上第 i i i个位置对应符号的综合属性值 x x x用 v [ i ] . x v[i].x v[i].x表示
例如:
A → X Y Z { v [ t o p − 2 ] . a : = f ( v [ t o p − 2 ] . x , v [ t o p − 1 ] . y , v [ t o p ] . z ; } A \to XYZ \qquad \{v[top-2].a := f(v[top-2].x, v[top-1].y,v[top].z;\} A→XYZ{v[top−2].a:=f(v[top−2].x,v[top−1].y,v[top].z;}
一般语法分析完成后,语义分析也完成。适合于一遍扫描自下而上分析。
例子:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lfWPE6gw-1642042136408)(…/picture/17.png)]
变换之后:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FWDRl5nM-1642042136410)(…/picture/18.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hthtO26S-1642042136411)(…/picture/26.png)]
既可以包含综合属性,也可以包含继承属性,满足两个条件:
对于每个产生式 A → X 1 X 2 … X n A \to X_1X_2\dots X_n A→X1X2…Xn其每个语义规则中的属性或者是综合属性,或者是 X i X_i Xi是一个继承属性且这个继承属性且这个继承属性仅依赖于:
S − S- S−属性文法一定是 L − L- L−属性文法,因为它只有综合属性
适合于一遍扫描自上而下的分析。当用一个产生式推导或者匹配输入串时,执行语义规则
在递归下降 L L ( 1 ) LL(1) LL(1)分析程序的设计中,每个非终结符都对应一个分析子函数,分析程序从文法开始符号所对应的分析子函数开始执行。
分析子函数根据下一个输入符号确定自顶向下分析过程中应使用的产生式,并根据产生式右端依次出现的符号来设计其行为
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-azyZP8pf-1642042136413)(…/picture/19.png)]
MatchToken函数用于判断正在处理的终结符与当前输入符号是否匹配:
不匹配直接报错,若匹配则词法分析程序读入下一个符号。
lookahead是当前扫描的输入符号
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gS7AcJkf-1642042136414)(…/picture/20.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yM0C2VMr-1642042136415)(…/picture/21.png)]
下面翻译模式可用于将二进制无符号定点小数转化为十进制小数
N
→
.
{
S
.
f
:
=
1
}
S
{
p
r
i
n
t
(
S
.
v
a
l
)
}
S
→
{
B
.
f
:
=
S
.
f
}
B
{
S
1
.
f
:
=
S
.
f
+
1
}
S
1
{
S
.
v
a
l
:
=
B
.
v
a
l
+
S
1
.
v
a
l
}
S
→
ε
{
S
.
v
a
l
:
=
0
}
B
→
0
{
B
.
v
a
l
:
=
0
}
B
→
1
{
B
.
v
a
l
:
=
2
−
B
.
f
}
N \to . \quad \{S.f:=1\} \quad S \{print(S.val)\}\\ S \to \{B.f:=S.f\} \quad B \{S_1.f:=S.f+1\} \quad S_1 \{S.val:=B.val+S_1.val\} \\ S \to \varepsilon \quad \{S.val := 0\} \\ B \to 0 \quad \{B.val:=0\} \\ B \to 1 \quad \{B.val:=2^{-B.f}\}
N→.{S.f:=1}S{print(S.val)}S→{B.f:=S.f}B{S1.f:=S.f+1}S1{S.val:=B.val+S1.val}S→ε{S.val:=0}B→0{B.val:=0}B→1{B.val:=2−B.f}
① 产生式左边的属性如果在右边出现,则采用函数带参形式。
② 然后根据产生式一句一句的去推。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lmy9UE8l-1642042136416)(…/picture/22.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6o0xvZiD-1642042136417)(…/picture/23.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KBlHdNaF-1642042136418)(…/picture/24.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-byot5zc8-1642042136420)(…/picture/25.png)]
把所有的语义动作都放在产生式的末尾
语义动作是在相同位置上的符号被展开(匹配成功)时执行的。
为了构造不带回溯的自顶向下语法分析,必须消除文法中的左递归。
当消除一个翻译模式的基本文法的左递归时,同时考虑属性计算
对于消除左递归中,引入的非终结符。
需要给他增加两个属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zRh9jfPc-1642042136421)(…/picture/27.png)]
首先把继承属性进行原来产生式的赋值(原本产生式的右端),然后再通过综合属性给原来产生式左端赋值。
往前走一步,可以把原来产生式的值传递给 R R R的继承属性
再往前一步,把 R R R的综合属性传递给后面表达式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dZWAIg6a-1642042136423)(C:/Users/DELL/AppData/Roaming/Typora/typora-user-images/image-20211130182821525.png)]
之前表达式的值
[外链图片转存中…(img-zRh9jfPc-1642042136421)]
首先把继承属性进行原来产生式的赋值(原本产生式的右端),然后再通过综合属性给原来产生式左端赋值。
往前走一步,可以把原来产生式的值传递给 R R R的继承属性
再往前一步,把 R R R的综合属性传递给后面表达式
[外链图片转存中…(img-dZWAIg6a-1642042136423)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。