目前,我正在使用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中的参数(例如xml中的E(E);xml中的E|L (E|L))。)谢谢!
发布于 2010-11-05 06:16:36
声明性思考: DCG总是描述一个列表。在DCG正文中,逗号(",")读作“然后”。例如,xml//1描述(根据它的第一个规则)单个元素,或者(根据它的第二个规则)一个元素,然后是xml//1描述的内容。元素//1是一个开始标记,然后是元素,然后是结束标记等。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标签与其名称相关联。
https://stackoverflow.com/questions/4100876
复制相似问题