0

我正在尝试在 prolog 中编写一个简单的 shell。我目前使用 read/1 查询用户的输入。

但是,我有两个问题要解决。

1) 用户只能输入条款。

该查询要求用户输入一个术语并要求输入以句点结尾。这是为了限制,因为我希望用户能够输入诸如“将变量设置为值”之类的命令(我将解析此字符串)。有没有办法在序言中读取这些字符串?(如果可能没有任何开销,例如列表表示、报价或结束期间?)

2) 如果用户输入了不正确的内容(例如空格),我会收到语法错误并且 shell 结束。处理这些错误并避免程序终止的快速且正确的方法是什么?

非常感谢所有帮助!

4

2 回答 2

3

可用的最佳“工具”:DCG。例如,使用 SWI-Prolog:

:- [library(http/dcg_basics),
    library(dialect/sicstus)
   ].


myshell :-
  read_line(L),
  phrase(command(C), L).

command(set(Variable, Value)) -->
  "set ", string(Variable), " to ", string(Value).
于 2012-01-07T21:18:25.520 回答
2

读取输入不限于术语,而是可以通过 和 以每个字符或每个字节为基础get_char/1执行get_byte/1。不完全引人注目,甚至不那么容易使用。例如,您可以查看The Art of Prolog中的一个小片段,其中作者定义了一个谓词以从标准输入中读取单词列表(缺少某些特定过程的定义,即由读者在他的需要的基础)。

Prolog 通过 支持错误处理catch/3,您可以使用它来捕获在读取操作期间萌芽的错误并做出正确反应。

于 2012-01-07T02:02:59.067 回答