2012-02-25 3 views
1

Parsec 라이브러리를 사용하여 Haskell에서 Pascal 언어 파서를 개발 중이며 Parsec.Token 클래스에 정의 된 일부 토큰을 다시 정의해야합니다. 내가 stringLiteral 토큰이 일치되는 방식을 변경해야Parsec.Token에서 "stringLiteral"토큰을 다시 정의하십시오.

:

여기에, 그것을 Speeking 나의 경우입니다. 기본 정의에서 뭔가가 between char '"' (see this)이지만, 나는 between '\'' (아포스트로피)이어야합니다. 어떻게 Parsec 동작에 대한이 수정을 할 수 있습니까?

감사합니다 !!!

+0

대체 'stringLiteral' 파서를 작성해야합니다. 불행히도 여러분은'LanguageDef'를 통해 주석으로 그것을 사용자 정의 할 수 없습니다. –

+0

알 겠어. 어쨌든 어휘 파서가 기본 문자열 대신에 다른 대안 인'stringLiteral' 파서를 사용하도록 강요 할까? –

+0

Thomas의 대답을 참조하십시오 ... –

답변

3

GenTokenParser이라는 데이터 유형의 필드를 조정하는 것에 대해 이야기하고 있습니다. 데이터 유형을 합당한 기본값으로 자동 채우는 함수를 사용하는 것처럼 보이지만 한 가지를 조정하고 싶다면 다음을 입력하십시오.

myMakeTokenParser langDef = 
    let default = makeTokenParser langDef 
    in default { stringLiteral = newStringLit } 
    where 
    newStringLit = lexeme (
         do{ str <- between (char '\'') 
             (char '\'' <?> "end of string") 
             (many stringChar) 
         ; return (foldr (maybe id (:)) "" str) 
         } 
         <?> "literal string") 
+0

예상되는 유형과 일치 할 수 없습니다. 'GenTokenParser s0 u0 m0 실제 유형 ParsecT s1 u1 m1 a0 Plexeme의 첫 번째 인수에서 ... ' ''Import qualified Text.Parsec.Token as P'를 가져 오기 때문에'P.lexeme'가 있습니다. –

+0

맞습니다. 저는 parsec에서 렉서의 일부를 복사하여 붙여 넣었습니다. 링크 된 모듈에서 코드의 큰 부분을 복사하여 붙여 넣거나 자신의 문자열 렉서를 만들어 newStringLit의 RHS에 넣을 수 있습니다. –

관련 문제