龙书习题——我的翻译方案对吗?

问题描述 投票:0回答:0

我开始做龙书第二版的练习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*
,它似乎是不正确的。相比之下,我的方案效果很好,但我不确定我的翻译方案可能隐藏的其他边缘情况。

assembly syntax compiler-construction language-translation translation-scheme
© www.soinside.com 2019 - 2024. All rights reserved.