Expr → for id := int1 to int2 do Expr1。这个产生式如何定义SDD
时间: 2024-05-15 18:12:29 浏览: 148
SSO.zip_http://sso.sto-expr_killer_sso
我们可以为 Expr 定义如下的 SDD:
1. 在 for 循环开始前,记录 id 的初始值为 int1。
2. 对 Expr1 进行 SDD 求值,并将其结果丢弃。
3. 如果 id 的值小于等于 int2,执行以下步骤:
- 对 Expr 进行 SDD 求值,并将其结果丢弃。
- 将 id 的值加 1。
- 跳转到第 3 步。
4. 如果 id 的值大于 int2,则退出 for 循环。
其中,SDD 的语义动作可以通过在产生式右侧的代码块中实现。例如,对于这个产生式,我们可以这样实现 SDD:
```
Expr → for id := int1 to int2 do Expr1
{
// 1. 在 for 循环开始前,记录 id 的初始值为 int1。
id.val = int1.val;
// 2. 对 Expr1 进行 SDD 求值,并将其结果丢弃。
Expr1.syn = null;
// 3. 如果 id 的值小于等于 int2,执行以下步骤:
while (id.val <= int2.val) {
// - 对 Expr 进行 SDD 求值,并将其结果丢弃。
Expr.syn = null;
// - 将 id 的值加 1。
id.val++;
// - 跳转到第 3 步。
}
// 4. 如果 id 的值大于 int2,则退出 for 循环。
Expr.syn = null;
}
```
在这个实现中,我们使用了一个名为 `syn` 的属性来保存 SDD 的语义值。在产生式右侧的代码块中,我们根据 SDD 动作的语义规则对 `syn` 进行赋值。在这个例子中,我们没有对 `syn` 进行赋值,而是直接将其设为 null,因为这个产生式的语义是执行一段代码块,而不是返回一个值。
阅读全文