2011-09-23 44 views
0

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

+0

清除我的问题:用户使用+, - ,*,/,)和(当然不是Lisp风格,而是像1 + 3 *(3 - 2)这样的日常输入)输入算术表达式,我想知道Racketors如何实现这些功能:是否有任何特定的函数或库文件? –

+0

好吧,我更新了我的答案,以引用球拍中包含的解析器示例。 –

+0

I已经想出了一个将* infix *算术表达式转换为*二元表达式树的算法,这是一个更好的解决方案,我会很快发布我的算法。 –

回答

1

有点难以分辨出你问的是什么问题。在方案(或球拍),你几乎肯定会写出这样的评价 “直接”,像这样:

  • 为E1 * E2,收益率(EVAL E1)倍(EVAL E2)
  • 为E1 + E2,return(eval E1)plus(eval E2)

...所以评估者的字面意思是三行。

请注意,在此定义中,不需要明确地跟踪堆栈(当然,您可以在任何其他语言中执行相同的操作 - 只有在您想写入时才使用显式堆栈 评估者以循环的形式,并且不想分开解析步骤)。

要解析表达式,您需要......好吧,您可能需要解析器。如果您使用的是Racket, 您可以参考collects/parser-tools/examples/calck.rkt中Racket附带的计算器示例。它处理你描述的一切。我可以把它全部粘贴在这里,但这可能是矫枉过正。

0

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