2017-05-20 6 views
0

나는 parsec 라이브러리를 시험 중이므로이 기본 작업을 처리하는 방법을 모르겠습니다.나머지 입력이 parsec로 공백인지 확인

data Foo = A | AB 

내가 문자열 "A"A로서 해석 할 수하고 "A B"AB 원하는 :

나는 다음과 같은 있다고 가정합시다. 난 그냥 이렇게하면 :

parseA :: parser Foo 
parseA = do 
      reserved "a" 
      return A 

parseAB :: parser Foo 
parseAB = do 
      reserved "a" 
      reserved "b" 
      return AB 

parseFoo :: parser Foo 
parseFoo = parseA 
     <|> parseAB 

parseFoo는 여전히 'A'를 소모 한 후 왼쪽 공백이 아닌 있다는 것을 상관하지 않는다 parseA 이후 A으로 "A B"를 구문 분석합니다. 이 문제를 어떻게 해결할 수 있습니까?

답변

3

문법을 AB | A으로 변경하고 parsec에서 try을 사용하여 파서에 미리보기 기능을 제공해야합니다.

parseFoo = try Parse AB <|> parse A 
+0

죄송합니다 작동합니다, 내가'parseAB' 잘 작동하는지 명확히해야, 내가 문제가 있습니다 parseFoo'은'입니다. – user181407

+0

아, 알겠습니다. 문법은 역 추적이 필요합니다. –

+1

문법을 AB | A와'시도'를 사용하여 parsec –