我有一些文本文件,我想要解析,但顺序的例子停止和启动可能是不同的。停止可能出现在前面或最后,这是一个虚拟的例子,因为有多个变量,如停止,开始.
Exemple1.txt
站:1
开始阶段:2
exemple2.txt
start: 9
停止:4
我知道如何解析开始和停止,当开始是第一次,停止是第二次,然而,当这些是随机的顺序时,我将如何做到这一点。
parseStart(D) --> "start: " , integer(D).
parseStop(D) --> "stop: " , integer(D).我从stdin收到要解析的文件,所以我收到了。
read_string解析1行,将其转换为char和do短语(parseStart(Startint),line1),但是对于第2行,我必须知道我不知道的顺序。
也许我可以做点什么
parseBoth(StartInt,StopInt) --> parseStart(startInt) <|> parseStop(StopInt) 做两次然后检查两者是否是统一的?然而,这似乎是一个黑客,我想知道是否有更好的方法来做到这一点?
编辑:停止,开始只是许多例子之一,我有许多dcg表达式是随机的,我将如何做到这一点,因为尝试每一个顺序将意味着我必须写6!6种可能的停止,开始,结束,时间的谓词..。表达
发布于 2020-04-12 09:31:28
也许是这样:
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).在问题编辑后更新。
如果文本文件的所有行都具有“关键字:整型”的格式,则可以使用:
parse_pairs([]) -->
eos.
parse_pairs([Pair| Pairs]) -->
parse_pair(Pair),
parse_pairs(Pairs).
parse_pair(Key-Value) -->
string(String), ": ", integer(Value), blanks,
{atom_string(Key, String)}.样例呼叫:
?- phrase(parse_pairs(Pairs), "start: 1\nstop: 2").
Pairs = [start-1, stop-2] .https://stackoverflow.com/questions/61169201
复制相似问题