コマンドインターフェイス用のDCGを作成しようとしています。アイデアは、入力の文字列を読み取り、スペースで分割し、結果のトークンのリストをDCGに渡してコマンドと引数に解析することです。解析の結果は、=..
と一緒に使用して呼び出す目標を構成するための用語のリストにする必要があります。しかし、私はSWI-Prolog(バージョン7.2.3)の文字列型の状況に本当に混乱しました。 SWI-Prologには、basic DCG functionalityのライブラリが含まれています。これには、整数を解析すると想定される目標integer//1
が含まれています。これはタイプエラーのために失敗しますが、大きな問題は、「トークンのリスト」を使用してSWI-PrologでDCGをうまく動作させる方法を理解できないことです。DCGライブラリ関数のプロローグタイプエラー
は、ここで私がやろうとしているものです:
:- use_module(library(dcg/basics)).
% integer//1 is from the dcg/basics lib
amount(X) --> integer(X), { X > 0 }.
cmd([show,all]) --> ["show"],["all"].
cmd([show,false]) --> ["show"].
cmd([skip,X]) --> ["skip"], amount(X).
% now in the interpreter:
?- phrase(cmd(L), ["show","all"]).
L = [show, all].
% what is the problem with this next query?
?- phrase(cmd(L), ["skip", "50"]).
ERROR: code_type/2: Type error: `character' expected, found `"50"' (a string)
私はSWIマニュアルのSection 5.2を読みましたが、それはかなり私の質問に答えていませんでした:
- により期待されているどのようなタイプライブラリ
dcg/basics
のinteger//1
?エラーメッセージには「文字」と表示されていますが、正確にはどういう意味か、「適切な」入力をどのように提供するのかに関する有用な参考文献は見つかりません。 phrase/2
に文字列(トークン)のリストを渡すと、integer//1
を使用してトークンを整数として解析できますか?integer//1
プリミティブを使用して数字の文字列を整数に解析する方法がない場合は、これをどのように行う必要がありますか?
Iたなく、すなわち、double_quote
SWI-Prologの中のフラグに加え、入力として単一の文字列を使用して、原子のリストを使用するなど異なる入力フォーマット、異なる値を使用して"skip 50"
をexpermentingのかなり["skip", "50"]
以上などですが、DCGがどのように機能しているのか分かりません。
私は、同様にこれらの3つのページを研究された例をたくさん持っているが、どれも非常に(私はそれらのすべてを掲示するのに十分な評判を持っていないので、いくつかのリンクは省略)私の問題に対処していない:
- チュートリアル「SWI-PrologにおけるDefinite Clause Grammarsの使用」Anne Ogborn著
- Amziからのチュートリアル!コマンドインタフェースをDCGとして書くことについてのプロローグ。
- 第三、より幅広い質問が整数が期待されているが、1つ、このようなものとして解析できない場合はエラーメッセージを生成する方法であるJRフィッシャーのPrologのチュートリアル
のセクション7.3:
% the user types:
> skip 50x
I didn't understand that number.
1つのアプローチは、上のDCGの変数X
を何らかの種類のエラー値に設定し、後でそれを確認することです(コマンドによって呼び出されると想定される仮想のskip/1
のような)が、より慣用的な方法?パーサーを書く際の私の経験の大部分は、HaskellのParsecとAttoparsecライブラリの使用に由来します。これらのライブラリは、かなり宣言的ですが、特にエラー処理に関しては多少異なります。
'integer'あなたDCGで定義されている方法は? – lurker
SWI-Prologに同梱されているライブラリの一部です。[here](http://www.swi-prolog.org/pldoc/doc/swi/library/dcg/basics.pl)に記載されています。この情報で投稿を編集します。 – DCE
その述語( 'integer(X)')は、ドキュメンテーションに従って整数引数を必要としますが、アトム( '' 50 '')を解析しようとしています(SWIプロローグが ' 50 "をアトム" 50 "と呼ぶ)。 – lurker