我一直在尝试使用带有语法规则的phrase_from_file来解析包含整数行的文件
line --> I,line,{integer(I)}.
line --> ['\n'].因此:phrase_from_file(line,'input.txt').
它失败了,我很快就迷路了,试图追踪它。我甚至尝试过打印I,但它甚至不能打印出来。
编辑::由于下面的解决方案都不能真正满足我的需求(使用read/1假设您正在阅读术语,有时编写DCG可能会花费太长时间),我对我搜索过的this代码进行了修改,主要的变化是添加了:
read_rest(-1,[]):-!.
read_word(C,[],C) :- ( C=32 ;
C=(-1)
) , !.发布于 2011-07-26 18:08:38
我猜这里有一个概念上的问题。虽然我不知道phrase_from_file/2的细节,也就是您使用的是哪个Prolog系统,但我假设它会产生字符代码。因此,对于文件中的整数123,您将得到字符代码0'1、0'2和0'3。这可能不是您想要的。
如果您想要处理字符,则需要使用非终结符而不是裸露的骨骼变量I来获取它们。而不是整数测试,您将需要一个字符测试,并且您可以更早地进行测试:
line --> [I], {0'0=<I, I=<0'9}, line.诚挚的问候
附注:您也可以使用术语读取操作,而不是使用DCG方法。另请参阅:read numbers from file in prolog and sorting
发布于 2011-07-26 20:11:53
如果您使用的是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代码的情况下切换到读取文件。
https://stackoverflow.com/questions/6827701
复制相似问题