3

この回答:非常に基本的な dcg プロローグ構文 は少し役に立ちましたが、[X] は次の文字しか取得できません。エンチラーダ全体が必要です。読み進めてください!

コマンド オプション パーサーを作成するために GNU Prolog を使用していますが、DCG ポイントで行き詰まっています。たとえば、「foo --as=json」を検索するこの文法規則がありますが、「何でも」の結果であるコードを取得する方法がわかりません。

as_opt --> "--as=", anything, { c( as_opt )}, !.
anything --> [], {c(anything_match)}.

そして、その gprolog 展開は次のとおりです。

as_opt([45, 45, 97, 115, 61|A], B) :-
        anything(A, C),
        c(as_opt), !,
        C = B.

anything(A, B) :-
        c(anything_match), !,
        A = B.

"c()" 述語は単純で、format() を使用して実行されたルールを stdout に追跡するために使用されるだけなので、実行中に何が起こっているかを確認できます。コードを手で書いていたら、次のようにします。

%% for completeness here!
c(Msg) :- format("Processed ~w~n", [Msg]).

as_opt([45, 45, 97, 115, 61|A], B) :-
        anything(A, C),
        c(as_opt), !,
        C = B,
        { g_assign( gvValue, B )}. %% just for example

元の DCG に戻ります。

as_opt --> "--as=", anything, { c( as_opt ), gassign( gvValue, ??? )}, !.

では、「???」のどこに何が入りますか? は。それは可能ですか...そうでなければなりません。自分で (facepalm) しようとしている場合に備えて、DCG ルールを拡張する方法について gprolog ルールを読み直しますが、それまでの間、どんな支援も大歓迎です。

ありがとう、ショーン。

4

3 に答える 3

3

リストを記述する最も単純な DCG 非終端記号の 1 つを求めています。

list --> [].
list --> [_], list.

記述されているリストに実際にアクセスするには、引数を導入します。

list([])    --> [].
list([L|Ls) --> [L], list(Ls)

次のように使用できます。

as_opt(Option) --> "--as=", list(Option).
于 2013-09-06T12:12:22.860 に答える
1

グローバル変数を使うべきではないと思います。代わりに、DCG 句に引数を追加して、値を取得します。

anything([C|Cs]) --> [C], anything(Cs).
anything([]) --> [].

それ以外の場合、残りは、ルールが成功した後、phrase/3 の最後の引数として使用でき、見出しの一致を「消費」します。

于 2013-09-06T12:09:17.873 に答える