4

我们正在尝试生成(以诡计)从字符串而不是标准输入读取字符的解析器和词法分析器。

我们开始修改 http://code.google.com/p/lalr-scm/source/browse/trunk/calc.scm?r=52代码中包含的计算器示例

问题似乎在以下行:

(let* ((location (make-source-location "*stdin*" 
(port-line (current-input-port)) 
(port-column (current-input-port)) -1 -1))

我们尝试定义一个新的输入端口:

(let* ((location (make-source-location "*stdin*" 
(port-line (open-input-string program)) 
(port-column (open-input-string program)) -1 -1))

并且变量程序是这样定义的:

(define program
"int x = 2;
 int y = 0;
 y= x*(2+3);"
 )     

但它不起作用,它仍然等待标准输入字符。

该文档缺少详细信息,因此我们无法弄清楚如何解决这个问题。

谢谢

4

1 回答 1

2

您非常非常接近解决方案!嗯,有点。但这是一个开始。查看原始代码,在您修改它的地方:

(let* ((location (make-source-location "*stdin*" (port-line (current-input-port)) (port-column (current-input-port)) -1 -1))
       (c (read-char)))
  ...)

在这里,您将所有内容更改(current-input-port)为您的字符串端口(顺便说一句,不要open-input-string多次调用,因为您每次都创建一个新的字符串端口,每个都有独立的光标),但它并不是唯一实际使用(current-input-port).

你看到了吗?它实际上在(read-char)通话中!该函数实际上接受一个端口参数,默认为(current-input-port).

事实上,如果您在上面搜索并搜索 and 的实例(read-char)(peek-char)您会注意到使用 of(current-input-port)几乎融入了整个make-lexer函数。所以你需要改变它。

我建议您为该make-lexer函数指定一个输入端口:

(define* (make-lexer errorp #:optional (input (current-input-port)))
  ...

然后更改和的所有实例以使用输入端口。也不要忘记改变你的电话:(read-char)(peek-char)make-source-location

(let* ((location (make-source-location "*stdin*" (port-line input) (port-column input) -1 -1))
       (c (read-char input)))
  ...)

现在,您可以使用(make-lexer errorp (open-input-string program))它并且它应该可以工作。(我没有测试过。)

于 2012-11-15T13:29:37.350 回答