我正在使用一个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的实例,但我已经有了构造函数,所以它应该是一个微不足道的变化。谢谢! –