本节内容依旧非常抽象,因此这里给出三道完整例题 ,对应以下3个重要知识点/题型:
1.0「自顶向下」构造LL(1)翻译程序
2.0「自底向上」构造LR(1)语义栈
3.0 「自顶向下/自底向上」中缀转后缀
▍1.0「自顶向下」构造LL(1)翻译程序
下面的翻译模式可用于将二进制无符号小数转化为十进制小数。请构造相应的递归下降翻译程序:
N → p {S.f := 1} S {print(S.val)} |
S → {B.f := S.f} B {S₁.f := S.f + 1} S₁ {S.val := B.val + S₁.val} |
S → ε {S.val := 0} |
B → 0 {B.val := 0} |
B → 1 {B.val := 2 ^ (-B₁.f)} |
先说明一个MatchToken函数:
// MatchToken用于判别【正在处理的终结符】与【当前扫描的输入符号】是否匹配
void MatchToken(int expected) {
if(lookahead != excepted) {
// lookahead为当前扫描的输入符号
printf("语法错误!");
exit(0); // 若不匹配:报告出错,跳出
} else {
lookahead = getToken(); // 若匹配:则向词法分析程序申请读入下一个输入符号
}
}
下面,为每个非终结符构造翻译程序:
>>> 小技巧(>_<):
<