编译原理作业五

5.3.1
下面是涉及运算符 + 和整数或浮点运算分量的表达式的文法。区分浮点数的方法是看它有无小数点。
E -> E + T | T
T -> num.num | num
(1)给出一个 SDD 来确定每个项 T 和表达式 E 的类型

SDD

产生式语义规则
(1)E->E1+Tif E1.type==T.type then E.type=E1.type else E.type=float
(2)E->TE.type==T.type
(3)T->numT.type=Integer
(4)E->num.numT.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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值