编译原理(八)

考虑以下语法制导定义(Syntax Directed Definition),对于输入串 gbbabbccd 构造带注释的分析树(annotated parse tree)

语法规则 语义规则
SABCDS\to ABCD S.val = A.val + B.val + C.val + D.val
AgBaA\to gBa A.val = B.val * 5
BB1bB\to B1b B.val = B1.val * 2
BbB\to b B.val = 2
CC1cC\to C1c C.val = C1.val * 3
CcC\to c C.val = 3
DdD\to d D.val = 1
S
S.val = A.val + B.val + C.val + D.val = 34
A
A.val = B.val * 5 = 20
B
B.val = B1.val * 2 = 4
C
C = C1.val * 3 = 9
D
D.val = 1
g
B
B.val = B1.val * 2 = 4
a
B1
B1.val = 2
b
C1
C1.val = 3
c
d
B1
B1.val = 2
b
b
c
b
flowchart TB
I0-->I1
I0-->I2
I0-->I3
I0-->I4
I1-->I5
I1-->I6
I1-->I7
I2-->I9
I2-->I10
I3-->I11
I3-->I12
I4-->I13
I6-->I14
I6-->I15
I9-->I16
I11-->I17
I14-->I18
I0["
    S
    S.val #equals; A.val + B.val + C.val + D.val #equals; 34
"]
I1["
    A
    A.val #equals; B.val * 5 #equals; 20
"]
I2["
    B
    B.val #equals; B1.val * 2 #equals; 4
"]
I3["
    C
    C #equals; C1.val * 3 #equals; 9
"]
I4["
    D
    D.val #equals; 1
"]
I5[g]
I6["
    B
    B.val #equals; B1.val * 2 #equals; 4
"]
I7[a]
I9["
    B1
    B1.val #equals; 2
"]
I10[b]
I11["
    C1
    C1.val #equals; 3
"]
I12[c]
I13[d]
I14["
    B1
    B1.val #equals; 2
"]
I15[b]
I16[b]
I17[c]
I18[b]

以下文法定义了二进制浮点数常量的语法规则。试给出一个 S 属性的语法制导定义,其作用是求出该二进制浮点数的十进制值,并存放在开始符号 S 相关联的一个综合属性 value 中。例如,对于输入串 101.101,S 的 value 属性值结果应该是 5.625。要求在编写语法制导定义时,不得改写文法

SL.LLLLBBB01S\to L.L\vert L\\ L\to LB\vert B\\ B\to 0\vert 1
语法规则 语义规则
SLS\to L S.val = L.val
SL1.L2S\to L_1.L_2 S.val = L1.val + L2.val * pow(0.5, L2.len)
LL1BL\to L_1B L.val = L1.val *2 + B.val, L.len = L1.len + 1
LBL\to B L.val = B.val, L.len = 1
B0B\to 0 B.val = 0
B1B\to 1 B.val = 1
欢迎来到本站!