我正在使用一個Parsec分析器來處理一個有點複雜的數據文件格式(我無法控制這種格式)。Parsec lookahead來處理整數
我已經取得了很多進展,但我目前堅持以下幾點。
我需要能夠在一定程度上解析這樣一行:
4 0.123 1.452 0.667 * 3.460 149 - -
語義上4
是NODENUM,該Floats
和*
爲負對數概率(因此,*
代表的負對數概率爲零)。 149
和減號是真的垃圾,我可以放棄,但我至少需要確保它們不會破壞解析器。
這是我到目前爲止有:
此處理「垃圾」,我提到。它可能會更簡單,但它本身就可以工作。
emAnnotationSet = (,,) <$> p_int <*>
(reqSpaces *> char '-') <*>
(reqSpaces *> char '-')
的nodeNum
在該行的開頭被另一個解析器,處理工作,我需要進不了。
問題是試圖從行中挑出所有的p_logProb
s,而不消耗emAnnotationSet
開頭的數字。
爲p_logProb
解析器是這樣的:
p_logProb = liftA mkScore (lp <?> "logProb")
where lp = try dub <|> string "*"
dub = (++) <$> ((++) <$> many1 digit <*> string ".") <*> many1 digit
最後,我嘗試將logProb
項從尾隨emAnnotationSet
(與整數開始)分開如下:
hmmMatchEmissions = optSpaces *> (V.fromList <$> sepBy p_logProb reqSpaces)
<* optSpaces <* emAnnotationSet <* eol
<?> "matchEmissions"
因此,p_logProb
只會在以數字開頭,包含一個小數點,然後有更多數字(此限制由文件格式所規定)的浮點數上成功。
我希望p_logProb
定義中的try
避免使用前導數字,如果它不解析小數和其餘的,但這似乎不工作;秒差距仍然抱怨說,它是整數的emAnnotationSet
數字後看到一個意想不到的空間:
Left "hmmNode" (line 1, column 196):
unexpected " "
expecting logProb
列196對應於減號之前的整數後的空間,所以這是很清楚,我的問題是,分析器正在使用該整數。我該如何解決這個問題,以便p_logProb
解析器正確地使用looka,從而爲emAnnotationSet
解析器留下輸入?
我想我可以得到我需要的東西。這些星號實際上不應該變成什麼;他們和雙打實際上已經成爲Score的實例,但我已經有了構造函數,所以它應該是一個微不足道的變化。謝謝! –