作为项目的一部分,我需要编写一个解析器,它可以读取文件并解析成我可以在我的程序中使用的事实。
文件结构如下所示:
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 及其在解析器中的使用。