Scheme中的算术表达式解析

Scheme中的算术表达式解析,scheme,Scheme,我知道如何使用堆栈来处理像`(1+2)*3'这样的算术表达式字符串。这个问题有没有一个典型的解决方案 是的,Scheme解决方案是解析表达式,然后像你已经知道的那样使用堆栈。要知道你在问什么问题有点困难。在Scheme(或Racket)中,您几乎肯定会“直接”编写这样一个评估者,如下所示: 对于E1*E2,返回(eval E1)次(eval E2) 对于E1+E2,返回(eval E1)加上(eval E2) 。。。因此,评估者实际上有三行长 请注意,在这个定义中,不需要显式跟踪堆栈(当然,

我知道如何使用堆栈来处理像`(1+2)*3'这样的算术表达式字符串。这个问题有没有一个典型的解决方案

是的,Scheme解决方案是解析表达式,然后像你已经知道的那样使用堆栈。

要知道你在问什么问题有点困难。在Scheme(或Racket)中,您几乎肯定会“直接”编写这样一个评估者,如下所示:

  • 对于E1*E2,返回(eval E1)次(eval E2)
  • 对于E1+E2,返回(eval E1)加上(eval E2)
。。。因此,评估者实际上有三行长

请注意,在这个定义中,不需要显式跟踪堆栈(当然,您可以 在任何其他语言中都可以做同样的事情——只有在需要编写时才使用显式堆栈 求值器以循环的形式存在,不希望分离解析步骤)

要解析表达式,您需要。。。嗯,您可能需要一个解析器。如果你用球拍,
您可以在
collects/parser tools/examples/calck.rkt
中查看Racket附带的计算器示例。它能处理你描述的一切。我可以把它全部粘贴到这里,但这可能太过分了。

为了澄清我的问题:用户输入一个带+,-,*,/,)和(,当然不是Lisp风格的算术表达式,而是像'1+3*(3-2)这样的日常表达式,而Racket程序需要评估其结果值。我想知道Racket程序是如何实现该功能的:它有任何特定的函数或库吗?好的,我更新了答案,以参考Racket中包含的解析器示例。我已经找到了一种算法,可以将中缀算术表达式转换为二进制表达式这是一个更好的解决方案。我将很快发布我的算法。