使用phrase_from_file读取文件的行

时间:2011-07-26 09:06:57

标签: prolog swi-prolog dcg

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

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

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

它失败了,我很快就试图追踪它。 我甚至试图打印I,但它甚至没有到达那里。

EDIT :: 由于下面的解决方案都不能满足我的需求(使用read/1假设您正在阅读术语,有时候写DCG可能需要花费太长时间),我用谷歌搜索了this代码,主要变化是增加:

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

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

2 个答案:

答案 0 :(得分:4)

如果您使用的是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代码。

答案 1 :(得分:3)

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

如果你想处理这些字符,你需要使用非终端而不是裸骨变量I来获取它们。而不是整数测试,你需要一个字符测试,你可以提前做测试:

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

最好的问候

P.S。:您也可以使用术语读取操作,而不是采用DCG方式。也可以看看: read numbers from file in prolog and sorting