【问题标题】:Parsing from standard input从标准输入解析
【发布时间】:2026-02-05 13:10:02
【问题描述】:

如何解析标准输入(无缓冲)?如果我理解正确的话,phrase/2 需要一个列表,而来自library(pure_input)phrase_from_file/2 需要一个文件。

我使用普通谓词(不是 DCG)和使用像 get_char/2read_line_to_codes/2 这样的内置函数解决了我的问题,但最终实现看起来与我用 C 编写的解决方案非常相似。

如果我可以偷偷问一个非常相关的问题:SWI-Prolog 中的标准输入是什么? read_line_to_codes (library(readutil)) 需要输入流(例如,与 get/1 不同)。我用以下谓词得到它:

input_stream(Stream) :-
    current_stream(Object, read, Stream),
    integer(Object).

。 . .这当然有效,但感觉有点被黑了。是否可以有多个打开的输入流?我怎么知道哪个是操作系统的标准输入(在我的例子中是 Linux)?

【问题讨论】:

    标签: prolog swi-prolog


    【解决方案1】:

    我认为您正在寻找正确的流命名。这里有一个可能有用的示例:

    ?- read_line_to_codes(user_input,L).
    |: a line
    L = [97, 32, 108, 105, 110, 101].
    

    我找到的最详细的解释页面是here

    【讨论】:

    • 我以为我已经仔细阅读了这个页面......这确实回答了我的标准输入问题。还是不知道能不能用DCG来解析标准输入。
    • 是的,使用像repeat, read_line_to_codes(user_input,L), phrase(your_grammar,L).这样的循环