2014-10-09 60 views
0

我已經寫了這個簡單的解析器,從命令行[ps auxww | ./myparser]並分析ps命令的輸出,以便將其插入到我創建的流程數據結構中。 我成功地解析了結果字符串的一行,但現在我卡住試圖解析整個字符串並返回一個[進程]而不是一個進程。問題是如何實現parsePS。它必須多次調用myParser才能解析每一行並返回一個Process列表並將其打印到終端中。 有人可以幫我嗎?Haskell命令系統解析器

回答

1

我不確定你有什麼失敗,但我猜測間距正在殺死你。如果是這樣,我有兩個想法可能會有所幫助。

修改myParser以消耗末尾的空格,並且many組合符應該有效。

myParser = do 
    ... 
    spaces 
    command <- pCommand 
    spaces -- CONSUME END OF LINE 
    return Entry{ ... } 

然後many myParser應該工作。

或者,您可以先分別將輸入分成幾行,然後分別調用parse。

argLines <- fmap lines getContents 

(我想你的意思是通過getLinehGetContents之前燒的第一行?)

0

這聽起來像你對我正在尋找一種方法來解析序列中的每一行並返回解析結果列表。來自Prelude的mapM怎麼樣?

如果myParser :: String -> Parser Process,然後mapM myParser :: [String] -> Parser [Process],這似乎是你在找什麼(使用通用名稱爲Parsec的解析器類型)。因此,如果您有一系列需要按順序解析的行(稱爲lns),則可以使用parse (mapM myParser) lns來獲取所需內容。