答案 0 :(得分:1)
转录此类等式的算法非常简单。
显然,首要任务是将给定的等式转换为reverse polish notation。从这里开始,您已经完全定义了执行顺序。
您现在必须为操作数准备堆栈。此时你就像普通的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计算器简单得多。
答案 1 :(得分:0)
您可以这样做的一种方法是首先将其转换为 AST
然后通过递归函数遍历AST来制作你的代码。
对于您的示例,您的代码将变成这样的
("/", ("*", "a", "b"), ("*", "c", "d")
用上述函数遍历,变成这个
t0 = a * b
t1 = c * d
t2 = t0 / t1