2010-12-05 21 views
0

Salut je le code suivantont besoin d'aide expression haskell (pas dans l'erreur du compilateur scope)

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) 

Et le compilateur dit que ce qui suit est pas portée « chaîne », « int » « nombre "

Pourquoi le compilateur se plaint-il de ces commandes, n'est-ce pas un nom de chaîne, un int et un nombre bien connu?

EDIT

Si vous où d'utiliser l'analyseur suivant, comment voulez-vous résoudre le problème?

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

Il semble que votre indentation soit brisée à la fin. Aussi, est ce code Parsec? – delnan

Répondre

0

Il semble que vous utilisez une sorte de bibliothèque comme l'analyse syntaxique parsecs, ou parser module de « la programmation en Haskell. » Vous devez importer celui que vous utilisez.

1

(Quelle version de parsec utilisez-vous?)

Il n'y a pas chain, int ou number fourni par parsec 2.x ou 3.x parsec, bien que ceux-ci seraient simples à écrire.

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

(non testé, et je suis juste deviner l'intention de votre code.)


petit analyseur mignon bibliothèque combinateur là. Est-ce que ce devoirs ou quelque chose?

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

Résolu, merci les gars =) – jakob