我编写了这个简单的解析器,它来自命令行[ps auxww | ./myparser]并解析ps命令的输出,以便将其插入到我创建的流程数据结构中。 我成功解析了一行结果字符串,但现在我试图解析整个字符串并返回[Process]而不是单个Process。问题是如何实现parsePS。它必须多次调用myParser才能解析每一行并返回一个Process列表并将其打印到终端中。 有人能帮助我吗?
答案 0 :(得分:1)
我不确定你失败了什么,但我猜测间距会让你失望。如果是这样,我有两个可能会有所帮助的想法。
修改myParser
以消耗末尾的空格,many
组合子应该有用。
myParser = do
...
spaces
command <- pCommand
spaces -- CONSUME END OF LINE
return Entry{ ... }
然后many myParser
应该有用。
或者,您可以先将输入分成几行,然后在每个行上调用解析。
argLines <- fmap lines getContents
(我认为你的意思是在getLine
之前通过hGetContents
刻录第一行?)
答案 1 :(得分:0)
听起来我正在寻找一种方法来按顺序解析每一行并返回一个解析结果列表。前奏曲mapM怎么样?
如果myParser :: String -> Parser Process
,那么mapM myParser :: [String] -> Parser [Process]
,这似乎是您正在寻找的(使用Parsec
的Parser类型的通用名称)。因此,如果您有一个要按顺序解析的行列表(称为lns
),则可以使用parse (mapM myParser) lns
来获得所需内容。