2010-12-05 8 views
0

こんにちは、私は次のコード(未スコープコンパイラエラーで)Haskellの式で助けを必要と

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」「数ではないことを言います"

これらのコマンドでコンパイラが不平を言っているのはなぜですか?チェーン、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

あなたがからParsecのように解析ライブラリのいくつかの並べ替え、またはparser moduleを使用しているようだ「はHaskellでプログラミング。」使用しているものをインポートする必要があります。

1

(あなたはパーセクのどのバージョンを使用していますか?)

これらを書くのは簡単なことでしょうけれどもParsecの2.xまたは3.xのParsecのではありませんchainint、または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

関連する問題