X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=exprparse%2Ftest.icl;h=d71664da5b1f555650382400407c6f83b5afe7dc;hb=95e99be6bdd04513688b88f1afaefac360eeff1d;hp=72f4de907b25242bb7128d67a3122f3d93a611ff;hpb=52b07dd4f4a5821ec016d82f8df442109217c1ce;p=clean-tests.git diff --git a/exprparse/test.icl b/exprparse/test.icl index 72f4de9..d71664d 100644 --- a/exprparse/test.icl +++ b/exprparse/test.icl @@ -1,32 +1,45 @@ module test import StdEnv - +import Data.Maybe import Data.Functor +import Data.Tuple +import Data.List import Control.Applicative +import Control.Monad + +import Text.Parsers.Simple.ParserCombinators -import Text.Parsers.Simple.Core -import Text.Parsers.Simple.Chars +operators :: [[Char]] +operators = + [ ['+-'] + , ['*/'] + , ['^'] + ] -preprocess :: [Char] -> [Char] -preprocess c = ['((((':foldr prep ['))))'] c] +preprocess :: [[Char]] [Char] -> [Char] +preprocess ops c = rep '(' maxb (foldr prep (rep ')' maxb []) 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] + maxb = length ops + 1 + + rep :: Char Int [Char] -> [Char] + rep c 0 r = r + rep c i r = [c:rep c (i-1) r] + + prep '(' cs = rep '(' maxb cs + prep ')' cs = rep ')' maxb cs + prep c cs = maybe [c:cs] (\(_, s)->rep ')' s [c:rep '(' s cs]) + (find (isMember c o fst) (zip2 ops [maxb-1,maxb-2..0])) :: Expr = BinOp Expr Char Expr | Lit Int | Var [Char] parseExpr :: Parser Char Expr -parseExpr - = BinOp <$ pToken '(' <*> parseExpr <*> pOneOf ['^*/+-'] <*> parseExpr <* pToken ')' +parseExpr = flip pChainl1 (flip BinOp <$> pOneOf ['+^-/*']) + ( Lit o toInt o toString <$> some pDigit <|> Var <$> some pAlpha - <|> Lit o toInt o toString <$> some pDigit + <|> pToken '(' *> parseExpr <* pToken ')' + ) -Start = parse parseExpr (preprocess ['a']) -//Start = parse parseExpr (preprocess ['a*b+c^d/e']) +//Start = parse parseExpr (preprocess ['a']) +//Start = preprocess operators ['a*1'] +Start = runParser parseExpr (preprocess operators ['5+5*5'])