다소 복잡한 데이터 파일 형식을 처리하기 위해 Parsec 파서에서 작업하고 있습니다.이 형식을 제어 할 수 없습니다.int를 처리하기위한 Parsec lookahead
나는 많은 진전을 이루었지만, 현재 다음과 같이 붙어 있습니다.
나는 다음과 같이 약간 줄을 구문 분석 할 수 있어야합니다 :
4 0.123 1.452 0.667 * 3.460 149 - -
의미 적의 4
가 NODENUM의 Floats
과 *
부정적인 로그 확률입니다이다 (그래서, *
이의 부정적인 로그를 나타냅니다 확률 0). 149
과 빼기 기호는 정말 쓸모 없기 때문에 폐기 할 수는 있지만 최소한 파서를 깨지 말아야합니다.
가 여기에 지금까지이 작업은 다음과 같습니다
이는 "쓰레기"처리 내가 언급했다. 아마도 더 간단 할 수도 있지만, 그 자체로 작동합니다.
emAnnotationSet = (,,) <$> p_int <*>
(reqSpaces *> char '-') <*>
(reqSpaces *> char '-')
라인의 시작 부분에 nodeNum
는 작동 다른 파서에 의해 처리되고 난에 얻을 필요가있다.
emAnnotationSet
의 시작 부분에 숫자를 사용하지 않고 모든 p_logProb
을 줄에서 꺼내는 데 문제가 있습니다.
p_logProb
에 대한 파서는 다음과 같습니다
p_logProb = liftA mkScore (lp <?> "logProb")
where lp = try dub <|> string "*"
dub = (++) <$> ((++) <$> many1 digit <*> string ".") <*> many1 digit
그리고 다음과 같이 마지막으로, 나는 (정수로 시작) 후행 emAnnotationSet
에서 logProb
항목을 구분하는 시도를 :
hmmMatchEmissions = optSpaces *> (V.fromList <$> sepBy p_logProb reqSpaces)
<* optSpaces <* emAnnotationSet <* eol
<?> "matchEmissions"
따라서 p_logProb
은 숫자로 시작하고 소수점을 포함하고 추가 숫자가있는 부동 소수점에서만 성공합니다 (이 제한은 파일 형식으로 간주됩니다).
p_logProb
정의의 try
은 10 진수와 나머지를 구문 분석하지 않은 경우 선행 숫자를 사용하지 않기를 기대했지만이 방법은 효과가없는 것 같습니다. 파섹은 여전히이 emAnnotationSet
에서 그 정수의 숫자 후 예상치 못한 공간을보고 불평 : (196)가 마이너스 기호 앞의 정수 후 공간에 해당
Left "hmmNode" (line 1, column 196):
unexpected " "
expecting logProb
열 때문에 문제가 있다는 것을 나에게 분명 파서가 정수를 사용 중입니다. p_logProb
파서가 lookahead를 올바르게 사용하므로 emAnnotationSet
파서에 대한 입력을 남겨 두도록이 문제를 해결할 수 있습니까?
나는 내가 필요한 것에 이것을 줄 수 있다고 생각한다. 그 별표는 실제로 아무것도가되어서는 안됩니다. 그들과 복식은 실제로 점수의 인스턴스가되지만, 나는 그것들을위한 생성자를 가지므로 사소한 변화가되어야한다. 감사! –