首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >请提供Prolog DCG插图

请提供Prolog DCG插图
EN

Stack Overflow用户
提问于 2010-11-05 04:13:00
回答 1查看 822关注 0票数 3

目前,我正在使用Prolog中的DCG来解析XML文件。我得到了以下代码片段,它能够解析简单的XML,例如:

代码语言:javascript
复制
<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被定义为:

代码语言:javascript
复制
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))。)谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-05 06:16:36

声明性思考: DCG总是描述一个列表。在DCG正文中,逗号(",")读作“然后”。例如,xml//1描述(根据它的第一个规则)单个元素,或者(根据它的第二个规则)一个元素,然后是xml//1描述的内容。元素//1是一个开始标记,然后是元素,然后是结束标记等。DCG头中使用的参数允许您将DCG主体所描述的序列与其他信息相关联,比如您特别感兴趣的子序列。以begintag//1为例,你可以问:

代码语言:javascript
复制
?- phrase(begintag(T), [<, test, >]).
T = test.

也是在另一个方向上:

代码语言:javascript
复制
?- phrase(begintag(test), Ls).
Ls = [<, test, >].

在begintag//1的情况下,标记名称似乎对您很重要,因此您为它引入了一个参数,一方面允许您生成具有给定名称的开始标记,另一方面允许您解析标记并提取其名称,以及,在第三方面,甚至询问最通用的查询:

代码语言:javascript
复制
?- phrase(begintag(T), Ls).
Ls = [<, T, >].

其抽象地将开始XML标签与其名称相关联。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4100876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档