输入特定字符时如何停止读取输入?

时间:2013-04-22 16:03:31

标签: scheme

我正在尝试在Scheme中实现我自己的减法功能。我必须使用apply方法将减法应用于用户的输入。问题是,用户输入必须介于(),[]或{}之间(我正在为一种小语言编写一个小型解释器)。我已经将代码管理好了开头括号,但我的问题是使用apply方法。我只需要读取在结束括号之前输入的数据。有没有办法读取输入并停在分隔符“)”,“]”或“{}”。即使你可以引导我朝着正确的方向指导一个分界符,我也可以让其余的工作。

这是我正在尝试做的事情:

(define subt (lambda (x)
             (apply - (read-line))))

但我希望它在结束时停止阅读。

2 个答案:

答案 0 :(得分:1)

每当你找到一个左括号时,将它添加到一个堆栈并开始将你沿途读到的字符添加到数据结构中,比如新的列表或语法树(注意:你必须逐个字符地阅读,否你的代码暗示的逐行!)。每当您找到与堆栈中最顶层元素对应的右括号时,从堆栈中弹出最上面的括号并停止向字符列表添加元素 - 此时您知道在使用的数据结构中已读取完整的表达式并且可以继续进行评估。

此外,您应该将用于解析输入的代码与用于评估它的代码分开,以便评估器接收列表,语法树或解析器返回的任何中间表示,而不必担心关于阅读字符,找到匹配的括号等。

修改

如果您不需要从头开始实现解析器,那么@GoZoner建议使用一个涉及内置过程的简单解决方案:使用read过程确保在{之间输入输入数字{1}}并以返回结束输入,如下所示:

()

答案 1 :(得分:1)

read程序会在#\(#\)之间读取方案表单。假设parens是一个合适的分隔符,则以下工作:

(define subt
  (lambda (x)
    (apply - (read))))

当然,-需要数字,而read会返回任何计划表格。

> (subt 'ignore)
(10 5 3 1)
1