以随机顺序解析DCG

问题描述 投票:1回答:1

我有一些文本文件要解析,但是示例停止和启动的顺序可能不同。 Stop可能首先出现或最后出现,这是一个虚拟的例子,因为有多个变量,如stop,start ...

Exemple1.txt

停止:1

开始:2

exemple2.txt

开始:9

停止:4

我知道如何解析启动和停止,当启动是第一个而停止是第二个时,但是当它们以随机顺序排列时,我将如何进行解析。

parseStart(D) --> "start: " , integer(D).
parseStop(D) --> "stop: " , integer(D).

我从stdin收到要解析的文件,所以我read_string解析第一行,将其转换为字符列表,并执行短语(parseStart(Startint),line1),与第二行相同,但是比我必须知道的顺序不多。

也许我可以做类似的事情

parseBoth(StartInt,StopInt) --> parseStart(startInt) <|> parseStop(StopInt) 

然后执行两次并检查两者是否统一?但是,这似乎是一个hack,我想知道是否有更好的方法可以做到这一点?

编辑:停止,开始只是众多示例之一,我有许多以随机顺序排列的dcg表达式,我将如何执行此操作,因为尝试所有顺序都意味着我必须写6! 6个可能的stop,start,end,time ...的谓词

prolog swi-prolog dcg
1个回答
1
投票

也许像:

parse(start(Start), stop(Stop)) -->
    first(Token),
    rest(Token, Start, Stop).

first(start) --> "start: ".
first(stop)  --> "stop: ".

rest(start, Start, Stop) -->
    integer(Start), stop(Stop).
rest(stop, Start, Stop) -->
    integer(Stop), start(Start).

start(Start) --> "start: " , integer(Start).
stop(Stop)   --> "stop: " , integer(Stop).
© www.soinside.com 2019 - 2024. All rights reserved.