解析Scheme中的算术表达式

时间:2011-09-23 01:32:22

标签: scheme

我知道如何使用 stack 来处理类似`(1 + 2)* 3'的算术表达式字符串。这个问题是否有典型的Scheme解决方案?

2 个答案:

答案 0 :(得分:1)

要说出你问的问题有点难。在Scheme(或Racket)中,您几乎肯定会“直接”编写这样的评估者,如下所示:

  • 表示E1 * E2,返回(eval E1)次(eval E2)
  • 表示E1 + E2,返回(eval E1)加(eval E2)

...所以评估员的字面长度为三行。

请注意,在此定义中,无需明确跟踪堆栈(当然,您 可以用任何其他语言做同样的事情 - 只有你想写时才使用显式堆栈 评估器以循环的形式出现,并且不想分离解析步骤。)

要解析表达式,你需要......好吧,你可能想要一个解析器。如果您使用的是Racket, 您可以在collects/parser-tools/examples/calck.rkt中查看Racket附带的计算器示例。它处理你描述的一切。我可以将它全部粘贴在这里,但这可能有点过头了。

答案 1 :(得分:0)

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