2012-11-22 4 views
1

이 파서가 작동하도록하고 싶습니다. 나는 현재 오류가 어디에 있는지 잘 모르겠습니다. 주로 "당신에게 계획을 씁니다"의 Parsec 섹션에서 가져옵니다.내 parsec 파서에 문제가 있습니까?

질문이 하나 더 있습니다 : 결국 작동하지만 물음표로 시작하는 문자열이 항상 목록의 마지막임을 보장 할 수있는 방법이 있습니까? ?

input_text :: String 
input_text = "Eval (isFib::, 1000, ?BOOL)" 

data LTuple 
    = Command [LTuple] 
    | Number Integer 
    | String String 
    | Query Bool 
    deriving (Eq, Ord, Show) 

data Command = Rd | Read | In | Take | Wr | Out | Eval 
    deriving (Eq, Ord, Show) 

main :: IO() 
main = do 
    case parse lindaCmd "example" input_text of 
    Left err -> print err 
    Right res -> putStrLn $ "I parsed: '" ++ res ++ "'" 

parseList :: Parser lindaTpl 
parseList = liftM Command $ sepBy1 lindaCmd (symbol ",") 

lindaCmd = string "rd" 
     <|> string "take" 
     <|> string "out" 
     <|> string "eval" 
     <|> do char '(' 
       x <- try parseList 
       char ')'return x 

현재 오류 메시지는 다음과 같습니다

test.hs:30:48: 
    Couldn't match expected type `ParsecT s0 u0 m0 sep0' 
       with actual type `String -> ParsecT s1 u1 m1 String' 
    In the return type of a call of `symbol' 
    Probable cause: `symbol' is applied to too few arguments 
    In the second argument of `sepBy1', namely `(symbol ",")' 
    In the second argument of `($)', namely 
     `sepBy1 lindaCmd (symbol ",")' 

test.hs:38:17: 
    The function `char' is applied to three arguments, 
    but its type `Char -> ParsecT s0 u0 m0 Char' has only one 
    In a stmt of a 'do' block: char ')' return x 
    In the second argument of `(<|>)', namely 
     `do { char '('; 
      x <- try parseList; 
      char ')' return x }' 
    In the second argument of `(<|>)', namely 
     `string "eval" 
     <|> 
     do { char '('; 
       x <- try parseList; 
       char ')' return x }' 
+3

입니다. 'return x'는 모두 한 줄에 표시됩니다. 'lindaCmd'의 끝. – huon

답변

3

첫 번째 오류 : dbaupp가 지적 하듯

parseList = liftM Command $ sepBy1 lindaCmd (symbol ",") 

아마,

parseList = liftM Command $ sepBy1 lindaCmd (string ",") 

두 번째 오류해야

 <|> do char '(' 
      x <- try parseList 
      char ')'return x 

당신이 지금 가지고있는 두 가지 오류를 수정해야

 <|> do char '(' 
      x <- try parseList 
      char ')' 
      return x 

해야하지만, 나는 더 이상이 있는지 확인합니다 확인하지 않았습니다.


편집 :

당신은

parseList :: Parser lindaTpl 

해야하지만 난 당신이 또한

lindaCmd :: Parser LTuple 
원하는 기대는

parseList :: Parser LTuple 

을 원하는 기대

lindaCmd의 본문을 수정해야합니다. 마지막 분기를 제외한 나머지 모든 유형은 Parser String ...

+0

기호에 관해서는 여기에서 예제를 실제로 따르고있었습니다. http://hackage.haskell.org/packages/archive/parsec/latest/doc/html/Text-Parsec-Combinator.html#v:sepBy –

+1

'symbol' ['GenTokenParser'] (http://hackage.haskell.org/packages/archive/parsec/latest/doc/html/Text-Parsec-Token.html#t:GenTokenParser) 데이터 유형의 필드 인 것으로 보입니다. 당신이 따라간 예제는 오래되었거나 항상 오류가 있습니다. – dave4420

+0

lindaCmd에서 LindaTpl이 예상 되었기 때문에 문자열이나 마지막 줄에서 다른 방향으로 문제가 발생합니다. –