如果在 LR 分析过程中根据(a)所得到的新翻译模式进行自底向上的语义计算,试 写出在按每个产生式归约时语义计算的一个代码片断(假设语义栈由向量 v 表示, 归约前栈顶位置为 top,终结符不对应语义值,而每个非终结符的综合属性都只对 应一个语义值,可用 v[i].num 或 v[i]. accepted 访问,不用考虑对 top 的维护)。
时间: 2024-03-15 14:41:38 浏览: 25
在按每个产生式归约时,可以根据新的翻译模式编写如下的语义计算代码片段:
S → A b {B.in_num := A .num + 100} B { S.num := B.num }
{
int top = v.size() - 1;
v[top - 2].num = v[top].num - 100;
v[top - 1].in_num = v[top - 2].num;
if (v[top].num == 0) {
v[top - 2].accepted = true;
} else {
v[top - 2].accepted = false;
}
v.resize(top - 1);
}
S → A b b {B.in_num := A .num + 50} B { S.num := B.num }
{
int top = v.size() - 1;
v[top - 3].num = v[top].num - 50;
v[top - 2].in_num = v[top - 3].num;
if (v[top].num == 0) {
v[top - 3].accepted = true;
} else {
v[top - 3].accepted = false;
}
v.resize(top - 2);
}
A → A1 a {A. num := A1.num + 1}
{
int top = v.size() - 1;
v[top - 1].num = v[top].num + 1;
v.resize(top);
}
A → ε {A. num := 0}
{
int top = v.size() - 1;
v[top].num = 0;
}
B → {B1.in_num := B.in_num} B1 a {B. num := B1.num - 1}
{
int top = v.size() - 1;
v[top - 3].in_num = v[top - 4].in_num;
v[top - 2].num = v[top].num - 1;
v.resize(top - 1);
}
B → ε {B. num := B.in_num }
{
int top = v.size() - 1;
v[top].num = v[top - 1].in_num;
}
其中,变量top表示语义栈的栈顶位置,v[top]表示当前产生式右部的最后一个符号的综合属性,v[top-1]表示倒数第二个符号的综合属性,以此类推。在计算每个产生式的语义时,先根据产生式右部的属性计算出产生式左部的属性,并将语义栈中对应的元素修改或删除,最终得到产生式左部的属性值。