3

現在、Prolog で DCG を使用して XML ファイルを解析しています。次のような単純な XML を解析できる次のコード スニペットを取得できました。

<author> <name> <f> arthur </f>
        <m> conan </m>
        <l> doyle </l>
     </name>
     <bday> <d> 22 </d>
        <m> 5  </m>
        <y> 1859 </y>
     </bday>
</author>

<author> <name> <f> william </f>
        <l> shakespeare </l>
     </name>
     <bday> <d> 23 </d>
        <m> 4  </m>
        <y> 1564 </y>
     </bday>
</author>
$

DCG は次のように定義されます。

xml([E]) --> element(E).
xml([E|L]) --> element(E), xml(L).

element(E) -->  begintag(N), elements(L), endtag(N), {E =.. [N|L]}.

elements(L) --> xml(L).
elements([E]) --> [E].

begintag(N) --> ['<', N, '>'].
endtag(N) -->   ['<', '/', N, '>'].

この場合、DCGがどのように機能するかを誰かが説明してくれますか? DCG の引数を理解するのに本当に苦労しています (例: [E] in xml([E]); [E|L] in xml([E|L]). ) ありがとうございます!

4

1 に答える 1

4

宣言的に考える: DCG は常にリストを記述します。DCG ボディでは、コンマ (",") は "and then" と読みます。したがって、たとえば、xml//1 は (最初の規則によって) 単一の要素を記述するか、(2 番目の規則によって) 要素記述してから、xml//1 によって再び記述される何かを記述します。element//1 は begintag、次に elements、次に endtag などです。DCG ヘッドで使用される引数により、DCG 本体によって記述されたシーケンスを、特に関心のあるサブシーケンスなどの他の情報に関連付けることができます。例 begintag//1 - 次のように尋ねることができます:

?- phrase(begintag(T), [<, test, >]).
T = test.

また、他の方向にも:

?- phrase(begintag(test), Ls).
Ls = [<, test, >].

begintag//1 の場合、タグ名はあなたにとって重要なようです。そのため、一方では指定された名前で開始タグを生成できるようにする引数を導入しました。一方では、タグを解析してその名前を抽出できます。また、最も一般的なクエリでさえ尋ねることができます。

?- phrase(begintag(T), Ls).
Ls = [<, T, >].

これは、XML の開始タグをその名前に抽象的に関連付けます。

于 2010-11-04T22:16:35.953 に答える