Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {-# LANGUAGE NoMonomorphismRestriction #-}
- import Text.Parsec
- import Text.Parsec.Expr
- import Control.Applicative hiding ((<|>), many)
- main = case parse p "" "$c = $a[$b]" of
- Left err -> putStrLn . show $ err
- Right r -> putStrLn . show $ r
- where p = (try assignment <|> command) <* eof
- data Command = Command [Variable]
- | Assignment Variable Expr
- deriving Show
- -- parses command of form: $var = $var[$index]
- command = do
- v1 <- var
- lexeme $ char '='
- v2 <- var
- lexeme $ char '['
- v3 <- var
- lexeme $ char ']'
- return $ Command [v1, v2, v3]
- assignment = do
- v1 <- var
- lexeme $ char '='
- e <- expr
- return $ Assignment v1 e
- data Variable = Variable String deriving Show
- data Expr = Add Expr Expr
- | Var Variable
- deriving Show
- --expr = fail ""
- expr = buildExpressionParser table term <?> "expression"
- term = Var <$> var <?> "term"
- table = [ [ binary "+" Add AssocLeft ] ]
- where binary name fun assoc = Infix (do lexeme . string $ name; return fun) assoc
- var = do char '$'
- name <- lexeme $ many letter
- return $ Variable name
- <?> "variable"
- lexeme p = p <* spaces
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement