将普通代码转换为3AC - 三个地址代码

时间:2016-12-01 12:55:54

标签: python algorithm transcription

我正在尝试制作一种能够转录某些输入的算法,例如:

(a * b) / (c * d)

并将在3AC中打印出这样的输入:

t1: a * b
t2: c * d
t3= t1/t2

有人有什么建议吗?

2 个答案:

答案 0 :(得分:1)

转录此类等式的算法非常简单。

显然,首要任务是将给定的等式转换为reverse polish notation。从这里开始,您已经完全定义了执行顺序。

您现在必须为操作数准备堆栈。此时你就像普通的RPN一样,除了执行操作并将结果放回操作数堆栈之外,你必须用新的数字打印新的TAC指令,并将该符号放回堆栈而不是结果。

在您的示例中,RPN将是:a b * c d * /

所以ab进入堆叠。当我们遇到*时,我们会从堆栈中弹出2个项目,打印t1 := a * b并将t1放在堆栈上。现在我们更多地遍历RPN并将cd放在堆栈上。现在我们来遇到另一个*,所以再次让我们从堆栈弹出2个项目,用新的TAC符号t2 := c * d打印它们并将我们的新符号t2放回堆栈。

最后我们遇到/所以我们再次从堆栈弹出2个项目,创建新符号并打印出来:) t3 := t1 / t2

这比标准RPN计算器简单得多。

答案 1 :(得分:0)

您可以这样做的一种方法是首先将其转换为 AST

然后通过递归函数遍历AST来制作你的代码。
对于您的示例,您的代码将变成这样的
("/", ("*", "a", "b"), ("*", "c", "d")
用上述函数遍历,变成这个

t0 = a * b
t1 = c * d
t2 = t0 / t1