首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用phrase_from_file读取文件行

使用phrase_from_file读取文件行
EN

Stack Overflow用户
提问于 2011-07-26 17:06:57
回答 2查看 813关注 0票数 5

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

代码语言:javascript
复制
line --> I,line,{integer(I)}.
line --> ['\n'].

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

它失败了,我很快就迷路了,试图追踪它。我甚至尝试过打印I,但它甚至不能打印出来。

编辑::由于下面的解决方案都不能真正满足我的需求(使用read/1假设您正在阅读术语,有时编写DCG可能会花费太长时间),我对我搜索过的this代码进行了修改,主要的变化是添加了:

代码语言:javascript
复制
read_rest(-1,[]):-!.

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-26 18:08:38

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

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

代码语言:javascript
复制
line --> [I], {0'0=<I, I=<0'9}, line.

诚挚的问候

附注:您也可以使用术语读取操作,而不是使用DCG方法。另请参阅:read numbers from file in prolog and sorting

票数 4
EN

Stack Overflow用户

发布于 2011-07-26 20:11:53

如果您使用的是phrase_from_file/2,那么在读取实际文件之前,有一种非常简单的方法可以测试您的程序。只需使用phrase/2调用完全相同的非终结符。因此,一个目标

代码语言:javascript
复制
phrase(line,"1\n2").

与调用

代码语言:javascript
复制
phrase_from_file(line,fichier)

当fichier是包含3个以上字符的文件时。因此,您可以使用phrase/2以一种非常简洁的方式进行测试和实验。

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

代码语言:javascript
复制
newline --> "\n".

换个新行。然后你仍然需要自己解析整数。但是,使用phrase/2测试这一切要容易得多。最棒的是,您可以在不更改实际DCG代码的情况下切换到读取文件。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6827701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档