Advertisement
Guest User

Parsec

a guest
Sep 8th, 2011
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {-# LANGUAGE NoMonomorphismRestriction #-}
  2. import Text.Parsec
  3. import Text.Parsec.Expr
  4. import Control.Applicative hiding ((<|>), many)
  5.  
  6. main = case parse p "" "$c = $a[$b]" of
  7.           Left err -> putStrLn . show $ err
  8.           Right r  -> putStrLn . show $ r
  9.     where p = (try assignment <|> command) <* eof
  10.          
  11.  
  12. data Command = Command [Variable]
  13.              | Assignment Variable Expr
  14.              deriving Show
  15.  
  16. -- parses command of form: $var = $var[$index]
  17. command = do
  18.     v1 <- var
  19.     lexeme $ char '='
  20.     v2 <- var
  21.     lexeme $ char '['
  22.     v3 <- var
  23.     lexeme $ char ']'
  24.     return $ Command [v1, v2, v3]
  25.  
  26. assignment = do
  27.     v1 <- var
  28.     lexeme $ char '='
  29.     e <- expr
  30.     return $ Assignment v1 e
  31.  
  32. data Variable = Variable String deriving Show
  33. data Expr = Add Expr Expr
  34.           | Var Variable
  35.           deriving Show
  36.  
  37. --expr = fail ""
  38. expr = buildExpressionParser table term <?> "expression"
  39.  
  40. term = Var <$> var <?> "term"
  41.  
  42. table = [ [ binary "+" Add AssocLeft ] ]
  43.     where binary name fun assoc = Infix (do lexeme . string $ name; return fun) assoc
  44.  
  45. var = do char '$'
  46.          name <- lexeme $ many letter  
  47.          return $ Variable name
  48.        <?> "variable"
  49.  
  50. lexeme p = p <* spaces
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement