파섹 (Parsec)을 사용하여 파싱 문자열을 배우기 시작 했으므로 마음을 감쌀 수없는 다음 문제에 직면했습니다.파섹 파서 : 특정 상황에서 사용자 정의 오류가 평가되지 않습니다.
다음 코드는 세 가지 파서 실행을 포함하며 두 개는 분명히 실패합니다. 이상한 점은 내 사용자 지정 실패 메시지는 두 번째 실행에서만 발생하며 세 번째 실행에서는 발생하지 않는다는 것입니다.
import Text.Parsec
import Text.Parsec.String
ps :: Parser String
ps = (string "123") <|> (string "456") <|> fail "my-failure"
main = do
putStrLn $ "A: " ++ show (parse ps "" "123")
putStrLn $ "\nB: " ++ show (parse ps "" "789")
putStrLn $ "\nC: " ++ show (parse ps "" "45x")
출력 : 항상 두 번째 <|>
의 부품 왼쪽에 장애가 발생 내 실패 메시지를 가지고
A: Right "123"
B: Left (line 1, column 1):
unexpected "7"
expecting "123" or "456"
my-failure
C: Left (line 1, column 1):
unexpected "x"
expecting "456"
어떤 것이 올바른 방법? 이전에 발생한 오류를 무시할 수 있습니까?
'당신이 사용하는 것을 선호 수도' "내 고장을"실패 <|> ['>'] (http://hackage.haskell.org/packages/archive/parsec/latest/doc/html/Text -parsec-Prim.html # v : -60--63--62-) '> "구문 요소"와 같이 사용하면'my-failure' 대신'expecting syntax element'라는 오류 메시지가 나타납니다. 하지만 여전히'try'를 사용해야합니다. – Beetle