【发布时间】:2012-12-11 00:34:13
【问题描述】:
作为项目的一部分,我需要编写一个解析器,它可以读取文件并解析成我可以在我的程序中使用的事实。
文件结构如下:
property = { el1 , el2 , ... }.
我到底想要的是:
property(el1).
property(el2).
...
我这样读我的文件:
main :-
open('myFile.txt', read, Str),
read_file(Str,Lines),
close(Str),
write(Lines), nl.
read_file(Stream,[]) :-
at_end_of_stream(Stream).
read_file(Stream,[X|L]) :-
\+ at_end_of_stream(Stream),
read(Stream,X),
parse(X), % Here I call upon my parser.
read_file(Stream,L).
现在我已经阅读了几本关于 DCG 的书籍和在线内容,但它们都解释了相同的简单示例,您可以在这些示例中生成诸如“猫吃蝙蝠”之类的句子......当我想在上面的示例中使用它时我失败得很惨。
我所做的是“解析”下一行:
property = el1.
到
property(el1).
用这个:
parse(X) :-
X =.. List, % Reason I do this is because X is one atom and not a list.
phrase(sentence(Statement), List),
asserta(Statement).
sentence(Statement) --> ['=', Gender, Person] , { Statement =.. [Gender, Person] }.
我什至不知道我是否在这里以正确的方式使用了 dcg,因此我们将不胜感激。现在我遇到的问题是,如何处理列表中的多个元素,以及如何处理“{”和“}”。
我真正想要的是一个可以处理这些类型的句子(超过2个元素)的dcg:
现在我知道这里的很多人在谈到 dcgs 时都会参考 dcg_basics 和 pio 库。但是,我还有一个问题,当我尝试使用该库时,我收到了错误:
ERROR: (c:/users/ldevriendt/documents/prolog/file3.pl:3):
Type error: `text' expected, found `http/dcg_basics'
Warning: (c:/users/ldevriendt/documents/prolog/file3.pl:3):
Goal (directive) failed: user:[library(http/dcg_basics)]
当我这样做时:
:- [library(http/dcg_basics)].
附加信息:
- 我在 Windows 环境中使用程序:SWI-Prolog-Editor。
对此的任何帮助将不胜感激!
编辑:这个问题的目的是了解更多关于 DCG 及其在解析器中的使用。
【问题讨论】:
-
尝试替换为
:- use_module(library(dcg/basics)). -
但我认为您的 SWI-Prolog 可能太旧了
-
我笔记本电脑上安装的版本似乎确实是旧版本的 SWI-Prolog。我在桌面上安装了所有东西,现在可以正常使用库。谢谢!
-
感谢 Floris 的问题 +1。如果你能接受我的回答,如果有用的话,我想会很好。
-
如前所述,如果可能的话,我首先想试试 DCG 解析器。我正在尝试使用我的课程(DCG)的元素来完成这项工作。虽然您对另一个问题的解决方案适用于该示例,但在输入不同的其他情况下将不起作用。例如,有时首选项将给出为: m1: w1 > {w2 , w3} > w4(不一定按此顺序)。此外,列表可能不完整,也需要处理。我想我在使用 DCG 时会有更多的可能性。
标签: parsing prolog swi-prolog dcg