我正在尝试制作一种可以转录某些输入的算法,例如:
(a * b) / (c * d)
并将在3AC中打印出这样的输入:
t1: a * b
t2: c * d
t3= t1/t2
有人有什么建议吗?
转录这些方程的算法非常简单。
显然,首要任务是将给定方程转换为反向波兰符号。从这里你已经有了完美定义的执行顺序。
您现在必须为操作数准备堆栈。此时,您只需像普通 RPN 一样执行此操作,除了执行操作并将结果放回操作数堆栈之外,您必须打印带有新数字的新 TAC 指令,并将该符号放回堆栈而不是结果。
在您的示例中,RPN 将是:a b * c d * /
所以a
,b
继续堆栈。当我们遇到*
我们从堆栈中弹出 2 个项目时,打印t1 := a * b
并放入t1
堆栈。现在我们更多地遍历 RPN 并将其放入c
堆栈d
。现在我们遇到另一个*
,所以再次让我们从堆栈中弹出 2 个项目,用新的 TAC 符号打印它们t2 := c * d
并将我们的新符号t2
放回堆栈中。
最后我们再次遇到/
,我们从堆栈中弹出 2 个项目,创建新符号并打印它:) t3 := t1 / t2
。
这比标准的 RPN 计算器要简单得多。
您可以这样做的一种方法是首先将其转换为AST
然后通过递归函数遍历AST来制作你的代码。
对于你的例子,你的代码将变成这样的东西
("/", ("*", "a", "b"), ("*", "c", "d")
,用所说的函数遍历并将它变成这个
t0 = a * b
t1 = c * d
t2 = t0 / t1