module test import StdEnv import Data.Functor import Control.Applicative import Text.Parsers.Simple.Core import Text.Parsers.Simple.Chars preprocess :: [Char] -> [Char] preprocess c = ['((((':foldr prep ['))))'] c] where prep '(' cs = ['(','(','(','(':cs] prep ')' cs = [')',')',')',')':cs] prep '^' cs = [')','^','(':cs] prep '*' cs = [')',')','*','(','(':cs] prep '/' cs = [')',')','/','(','(':cs] prep '+' cs = [')',')',')','+','(','(','(':cs] prep '-' cs = [')',')',')','-','(','(','(':cs] prep c cs = [c:cs] :: Expr = BinOp Expr Char Expr | Lit Int | Var [Char] parseExpr :: Parser Char Expr parseExpr = BinOp <$ pToken '(' <*> parseExpr <*> pOneOf ['^*/+-'] <*> parseExpr <* pToken ')' <|> Var <$> some pAlpha <|> Lit o toInt o toString <$> some pDigit Start = parse parseExpr (preprocess ['a']) //Start = parse parseExpr (preprocess ['a*b+c^d/e'])