Parsing 以下输入0.110上的SDT结果应该是什么?

Parsing 以下输入0.110上的SDT结果应该是什么?,parsing,compiler-construction,Parsing,Compiler Construction,考虑以下具有相应合成属性的语法: F -> .L { F.val = L.val } L -> LB { L.length = L.length`+ 1}{L.val = L.val + 2^ (-L.length) * B.val} L -> B { L.length = 1, L.val = B.val/2} B -> 0 { B.val = 0} B -> 1 { B.val = 1} 如果“F.val”给

考虑以下具有相应合成属性的语法:

F -> .L  {    F.val = L.val    }
L -> LB  {    L.length = L.length`+ 1}{L.val = L.val + 2^ (-L.length) * B.val}
L -> B   {    L.length = 1, L.val = B.val/2}
B -> 0   {    B.val = 0}
B -> 1   {    B.val = 1}
如果“F.val”给出了上述语法中由F生成的二进制分数的值,则输入时的F.val值 {0.110}是uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(小数点后3位)

答案是0.875。我想知道他们是如何计算L值的 我们可以看到,当 L.val=0.75,实际上应该是1,因为:

L.value = L.value + 2^(- L.length) * B.val
        = 0.5 + 2^(-1)*1
        = 0.5 + 0.5
        = 1
这样写规则有点含糊不清,因为
L
用于引用父节点和子节点。在这种情况下,很明显,第一个L指的是父节点,第二个L指的是子节点(否则,
L.length=L.length…
将是无限递归的),但符号中没有明确说明这一点。为了解决这种模糊性,我们通常向子节点添加索引,如下所示:

L -> L1 B  { L.length = L1.length + 1}
很明显,等号后面的
L.val
必须指向
L1.val
,否则它将再次无限递归。但是
L.length
实际上可以指任何一个。也就是说,上述内容可以解释为:

L -> L1 B  { L.length = L1.length + 1} { L.val = L1.val + 2 ^ (-L1.length) * B.val }
因此,后者必须是预期的解释

L.val = L.val + 2 ^ (-L.length) * B.val
L -> L1 B  { L.length = L1.length + 1} { L.val = L1.val + 2 ^ (-L1.length) * B.val }
L -> L1 B  { L.length = L1.length + 1} { L.val = L1.val + 2 ^ (-L.length) * B.val }
L.val = L1.val + 2 ^ (-L.length) * B.val
      = 0.5 + 2^-2 * 1
      = 0.5 + 0.25
      = 0.75