2013-02-22 1 views
8

48 시간 자습서에 자신을 작성해 보겠습니다.Haskell Parsec, oneOf를 [String]으로 변경

symbol :: Parser Char 
symbol = oneOf "!#$%&|*+-/:<=>[email protected]^_~" 

이것은 기호에 적합하지만 키워드 목록이 있으면 어떻게됩니까? (즉, struct, int)

하나를 목록에 적용 할 수 있습니까? 이것은 아래에 묘사 된 이상적으로 내가 원하는 것입니다.

keywords :: Parser String 
keywords = oneOf ["struct","int",..etc] 

또는 Text.Parsec.Char을 가져 와서 키워드 목록에서 mapM을 사용해야합니까?

저는 토큰 화를 시도하고 있으며이 길을 건너간 다른 사람들로부터 모범 사례가 무엇인지 알고 싶었습니다.

divOrMod = string "div" 
       <|> string "mod" 
이의 일반적인 형태는 다음과 같은 유형이 the choice combinator입니다

http://hackage.haskell.org/packages/archive/parsec/3.0.0/doc/html/Text-Parsec-Char.html

+0

이 튜토리얼에 대한 몇 가지 질문이 있습니다 ... 괜찮습니까? – hashcode55

답변

11

: 기본적으로

choice :: Stream s m t => [ParsecT s u m a] -> ParsecT s u m a 

을, 당신이 제공

워드 프로세서는 다음과 같이 사용하는 말 그것은 파서 목록이며, 성공할 때까지 순서대로 시도합니다. choice(<|>)을 사용하여 구현되었으므로 그 방법과 동일합니다.

키워드 목록과 일치 시키려면 String의 목록에 string을 매핑 한 다음 choice을 사용하면됩니다.

반면에 mapM string은 전혀 다른 작업을 수행합니다. 즉, 의 모든이 순서대로 성공할 것으로 예상됩니다.

+1

keys = [ "class", "constructor"...] 키워드 = 선택 $지도 문자열 키. 새로운 버전의 Parsec을 사용하고 있습니까? 'Text.Parsec.Prim.Stream s0 m0 Char) 의 인스턴스가 없습니다. –

+1

@Dave : 명시적인 타입 서명을 부여하십시오. –

+0

아. 감사! :) –