72f4de907b25242bb7128d67a3122f3d93a611ff
[clean-tests.git] / exprparse / test.icl
1 module test
2
3 import StdEnv
4
5 import Data.Functor
6 import Control.Applicative
7
8 import Text.Parsers.Simple.Core
9 import Text.Parsers.Simple.Chars
10
11 preprocess :: [Char] -> [Char]
12 preprocess c = ['((((':foldr prep ['))))'] c]
13 where
14 prep '(' cs = ['(','(','(','(':cs]
15 prep ')' cs = [')',')',')',')':cs]
16 prep '^' cs = [')','^','(':cs]
17 prep '*' cs = [')',')','*','(','(':cs]
18 prep '/' cs = [')',')','/','(','(':cs]
19 prep '+' cs = [')',')',')','+','(','(','(':cs]
20 prep '-' cs = [')',')',')','-','(','(','(':cs]
21 prep c cs = [c:cs]
22
23 :: Expr = BinOp Expr Char Expr | Lit Int | Var [Char]
24
25 parseExpr :: Parser Char Expr
26 parseExpr
27 = BinOp <$ pToken '(' <*> parseExpr <*> pOneOf ['^*/+-'] <*> parseExpr <* pToken ')'
28 <|> Var <$> some pAlpha
29 <|> Lit o toInt o toString <$> some pDigit
30
31 Start = parse parseExpr (preprocess ['a'])
32 //Start = parse parseExpr (preprocess ['a*b+c^d/e'])