2012-01-07 33 views
0

我正在嘗試在prolog中編寫一個簡單的shell。 我目前使用read/1查詢用戶輸入。Prolog從用戶處獲得字符串輸入並避免程序在出現錯誤輸入時終止

但是我有兩個問題想解決。

1)用戶只能輸入條款。

該查詢要求用戶輸入一個術語並要求輸入以句點結尾。 這是爲了限制,因爲我希望用戶能夠輸入像'設置變量值'(我會解析這個字符串)的命令。有沒有什麼方法可以在prolog中讀取這樣的字符串? (如果可能沒有任何開銷,如列表respresentation,報價或結束期?)

2)如果用戶輸入不正確的東西(如空間),我得到一個語法錯誤,並結束外殼。 什麼是處理這些錯誤並避免程序終止的快速且正確的方法?

所有幫助最受讚賞!

回答

2

讀取輸入不限於術語,但可以通過get_char/1get_byte/1以每個字符或每個字節爲基礎執行。不完全引人注目,甚至不容易處理。作爲一個例子,你可以看一下small snippet from The Art of Prolog,作者定義一個謂詞來從標準輸入中讀取一個單詞列表(某些特定程序的定義丟失,即由讀者根據他的需要提供) 。

Prolog支持通過catch/3進行錯誤處理,您可以使用它來捕獲在讀取操作期間發生的錯誤並進行正確反應。

+0

如何使用get_char獲取例如使用空格作爲分隔符的單詞列表的例子將非常感謝!例如,如果用戶鍵入:非常感謝,我想獲得[非常感謝,很多],我可以輕鬆解析。不要感到有責任感,但謝謝所有情況。 – codelidoo 2012-01-08 02:52:04

+0

@codelidoo我添加了一個由着名的Prolog書籍提供的示例的鏈接。希望能幫助到你。 – 2012-01-08 06:49:07

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). 
相關問題