5

我一直在尝试使用phrase_from_file语法规则解析包含整数行的文件

line --> I,line,{integer(I)}.
line --> ['\n'].

因此:phrase_from_file(line,'input.txt').

它失败了,我很快就迷路了,试图追踪它。我什至尝试过 print I,但它甚至没有到达那里。

编辑:: 由于以下解决方案都没有真正适合我的需求(read/1假设您正在阅读术语,有时写 DCG 可能需要太长时间),我蚕食了我在谷歌上搜索的这段代码,主要变化是添加:

read_rest(-1,[]):-!.

read_word(C,[],C) :- ( C=32 ;
                       C=(-1)
                     ) , !.
4

2 回答 2

5

如果您使用phrase_from_file/2的是一种非常简单的方法,可以在读取实际文件之前测试您的程序。只需用 . 调用相同的非终端即可phrase/2。于是,一个目标

phrase(line,"1\n2").

和调用一样

phrase_from_file(line,fichier)

当 fichier 是包含以上 3 个字符的文件时。因此,您可以使用phrase/2.

@Jan Burse 已经提到了其他问题。SWI 读取字符代码。所以你必须写

newline --> "\n".

换行。然后你仍然需要自己解析整数。但是使用phrase/2. 好消息是您可以在不更改实际 DCG 代码的情况下切换到读取文件。

于 2011-07-26T12:11:53.440 回答
4

我想这里有一个概念问题。虽然我不知道phrase_from_file/2 的细节,即你使用的是哪个Prolog 系统,但我认为它会产生字符代码。因此,对于文件中的整数 123,您将获得字符代码 0'1、0'2 和 0'3。这可能不是你想要的。

如果您想处理字符,则需要使用非终端而不是裸骨变量 I 来获取它们。而不是整数测试,你需要一个字符测试,你可以更早地进行测试:

line --> [I], {0'0=<I, I=<0'9}, line.

此致

PS:您也可以使用术语读取操作,而不是采用 DCG 方式。另请参阅: 从 prolog 中的文件中读取数字并排序

于 2011-07-26T10:08:38.260 回答