2010-12-05 4 views
0

안녕이는 (안 범위 컴파일러 오류) 하스켈의 발현과 관련하여 도움이 필요

expression :: String → Maybe Expr 
expression s = case parse expr s' of 
     Just (a,"") → Just a 
     _   → Nothing 
    where s' = filter (λx → x ≠ ' ') s 

expr, term, factor, num, sin', cos' :: Parser Expr 
num = dbl' +++ int' 

expr = chain term '+' Add 

term = chain factor '*' Mul 



func = sin' +++ cos' 

var' = do 
     char 'x' 
     return (Var "x") 

int' = do n ← int 
      return (Num (fromIntegral n)) 

dbl' = do n ← int 
    char '.' 
    n' ← oneOrMore number 
    let c = ((show n) ⊕ "." ⊕ n') 
    return (Dbl (read c)) 

sin' = do char 's' 
    char 'i' 
      char 'n' 
    e ← factor 
      return (Sin e) 

그리고 컴파일러가 다음 번호 ""체인 ","INT "범위에없는 것을 말한다 다음 코드 "

컴파일러가 이러한 명령에 대해 불평하는 이유는 체인, 정수 및 번호가 잘 알려진 이름이 아닙니까? 어디 다음 파서를 사용하는 경우

, 당신은 어떻게이 문제를 해결할 EDIT?

module Parsing 
(Parser,parse, 
    success,failure,sat,pmap,char,digit, 
    (+++),(<:>),(>*>),(>->),(<-<), 
    oneOrMore,zeroOrMore 
) 

where 

import Data.Maybe 
import Data.Char 

------------------ 



------------------- 
-- Basic Parsers, dependent on internal structure -- 
-- success and fail 
failure = P $ \s -> Nothing 
success a = P $ \s -> Just (a,s) 

-- Parse any single character 
item = P $ \s -> case s of 
       []  -> Nothing 
       (c:cs) -> Just (c,cs) 

-- (+++) parse either using p or else using q 
infixr 5 +++ 
(+++) :: Parser a -> Parser a -> Parser a 

p +++ q = P $ \s -> listToMaybe [ x | Just x <- [parse p s, parse q s]] 

-- (p >*> f) parse using p to produce a. 
-- Then parse using f a 

infixl 1 >*> 

(>*>) :: Parser a -> (a -> Parser b) -> Parser b 

p >*> f = P $ \s -> 
      case parse p s of 
        Just(a,s') -> parse (f a) s' 
        _   -> Nothing 

----------------------------------------------- 


-- pmap modifies the result of a parser 
pmap :: (a -> b) -> Parser a -> Parser b 
pmap f p = p >*> success . f 

p >-> q = p >*> \_ -> q -- equivalent to monadic op: >> 
p <-< q = p >*> \a -> q >-> success a 


(<:>):: Parser a -> Parser [a] -> Parser [a] 
p <:> q = p >*> \a -> pmap (a:) q 
+0

들여 쓰기가 끝난 것 같습니다. 또한,이 Parsec 코드가 무엇입니까? – delnan

답변

0

당신이 파섹과 같은 라이브러리를 구문 분석의 일종, 또는에서 parser module 사용하고있는 것으로 보인다 "하스켈 프로그래밍을." 사용중인 것을 가져와야합니다.

1

(파섹의 어떤 버전을 사용하고 있습니까?)이 작성하는 것이 간단 할 것이지만

, 아니 chain, int, 또는 파섹 2.x 또는 파섹 3.X에서 제공 number 없습니다.

chain term op cons = sepBy1 expr (char op) >>= return . foldr1 cons 
int = many1 digit >>= return . read 
number = digit 

은 (테스트되지 않은, 난 그냥 코드의 의도로 추측하고있어.)


귀여운 파서 콤비 라이브러리가. 이 숙제인가요?

punva grez bc pbaf = cznc (sbyqe1 pbaf) $ grez <:> mrebBeZber (pune bc >-> grez) 
vag = cznc ernq $ barBeZber qvtvg 
+0

해결되었습니다. 감사합니다. =) – jakob