我开始做龙书第二版的练习2.4.5,在网上找到了一些答案,但对我来说似乎是错误的 首先这是练习:
Construct a syntax-directed translation scheme that translates postfix arithmetic expressions into equivalent prefix arithmetic expressions.
生产:
expr -> expr expr op | digit
翻译方案:
expr -> {print(op)} expr expr op | digit {print(digit)}
我为两个表达式
952*-
和 95-2*
尝试了这个方案。
952*-
正确转换为前缀表达式 (952*- => -9*52)
,但 95-2*
不是! (95-2* => -95*2, should be 95-2* => *-952)
我构建了我自己的方案,它似乎适用于两种情况:
Exercise 2.3.5
(postfix 1 and 2 is used just to differ production instances)
root -> expr
expr -> expr1 term + expr2 |
expr1 term - expr2 |
term
term -> term fact * term |
term fact / term |
term
fact -> digit |
expr |
e
digit -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Translation scheme:
root -> expr { root.value = expr.prefix; print(root.value) }
expr -> expr1 term + expr2 {
expr.prefix = expr2.op || '+' || expr1.prefix || term.prefix || expr2.digits,
expr.op = '+',
expr.digits = expr1.digits || term.digits || expr2.prefix
}
expr -> expr1 term - expr2 {
expr.prefix = expr2.op || '-' || expr1.prefix || term.prefix || expr2.digits,
expr.op = '-',
expr.digits = expr1.digits || term.digits || expr2.prefix
}
expr -> term {
expr.prefix = term.prefix,
expr.op = term.op,
expr.digits = term.digits
}
term -> term1 fact * term2 {
term.prefix = term2.op || '*' || term1.prefix || fact.prefix || term2.digits,
term.op = '*',
term.digits = term1.digits || fact.digits || term2.prefix
}
term -> term1 fact / term2 {
term.prefix = term2.op || '/' || term1.prefix || fact.prefix || term2.digits,
term.op = '/',
term.digits = term1.digits || fact.digits || term2.prefix
}
term -> fact {
term.prefix = fact.prefix,
term.op = fact.op,
term.digits = fact.digits
}
fact -> digit {
fact.prefix = e,
fact.op = e,
fact.digit = digit.value
}
fact -> expr {
fact.prefix = expr.prefix,
fact.op = expr.op,
fact.digit = expr.digit
}
fact -> e {
fact.prefix = e,
fact.op = e,
fact.digit = e
}
digit -> 0 { digit.value = 0 }
digit -> 1 { digit.value = 1 }
digit -> 2 { digit.value = 2 }
digit -> 3 { digit.value = 3 }
digit -> 4 { digit.value = 4 }
digit -> 5 { digit.value = 5 }
digit -> 6 { digit.value = 6 }
digit -> 7 { digit.value = 7 }
digit -> 8 { digit.value = 8 }
digit -> 9 { digit.value = 9 }
专家!请让我知道我的翻译方案是否正确?而这个网络答案确实是错误的?或者我只是错过了什么?
提前谢谢你!
我试图评估我在互联网上找到的翻译方案的价值
952*-
,95-2*
,它似乎是不正确的。相比之下,我的方案效果很好,但我不确定我的翻译方案可能隐藏的其他边缘情况。