5.3.1
下面是涉及运算符 + 和整数或浮点运算分量的表达式的文法。区分浮点数的方法是看它有无小数点。
E -> E + T | T
T -> num.num | num
(1)给出一个 SDD 来确定每个项 T 和表达式 E 的类型
SDD
产生式 | 语义规则 |
---|---|
(1)E->E1+T | if E1.type==T.type then E.type=E1.type else E.type=float |
(2)E->T | E.type==T.type |
(3)T->num | T.type=Integer |
(4)E->num.num | T.type==float |
5.4.3
下面的 SDT 计算了一个由 0 和 1 组成的串的值。它把输入的符号串当做正二进制数来解释。
B -> B_1 0 {B.val = 2 * B_1.val}
| B_1 1 {B.val = 2 * B_1.val + 1}
| 1 {B.val = 1}
改写这个 SDT,使得基础文法不再是左递归的,但仍然可以计算出整个输入串的相同的 B.val 的值。
A->Aa|b
A->bA’
A’->aA’|ε
提取左公因子:
B -> B_1 num {B.val = 2 * B_1.val + num.val}
| 1 {B.val = 1}
num -> 0 {num.val = 0}
| 1 {num.val = 1}
消除左递归:
B -> 1 {B’.i = 1} B’
A -> num{B’_1.i = 2 * B’.i + digit.val} B’_1 {B’.val = B’_1.val}
| ε {B’.val = B’.i}
num -> 0 {num.val = 0}
| 1 {num.val = 1}