0

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

(a * b) / (c * d)

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

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

有人有什么建议吗?

4

2 回答 2

1

转录这些方程的算法非常简单。

显然,首要任务是将给定方程转换为反向波兰符号。从这里你已经有了完美定义的执行顺序。

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

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

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

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

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

于 2016-12-01T13:15:21.050 回答
0

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

然后通过递归函数遍历AST来制作你的代码。
对于你的例子,你的代码将变成这样的东西
("/", ("*", "a", "b"), ("*", "c", "d")
,用所说的函数遍历并将它变成这个

t0 = a * b
t1 = c * d
t2 = t0 / t1
于 2021-06-30T16:39:28.867 回答