blob: 2d6937aa374acb8303a47f320160923344366b14 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
module Parser.Expr where
import Control.Applicative
import Parser.Core
import Expr
imaginaryP :: Parser Expr
imaginaryP = Imaginary <$> (floatP <* char 'i')
rationalP :: Parser Expr
rationalP = Rational <$> floatP
matrixP :: Parser Expr
matrixP = Matrix <$> (char '[' *> sepBy (char ';') matrixRowP <* char ']')
where matrixRowP = char '[' *> sepBy (char ',') exprP <* char ']'
exprP :: Parser Expr
exprP = termP `chainl1` termOpP
where termOpP = infixOp "+" Add <|> infixOp "-" Sub
termP :: Parser Expr
termP = factorP `chainl1` factorOpP
where factorOpP = infixOp "**" Dot <|> infixOp "*" Mul <|> infixOp "/" Div <|> infixOp "%" Mod
factorP :: Parser Expr
factorP = endpointP `chainl1` expOpP
where expOpP = infixOp "^" Exp
endpointP = parensExprP
<|> imaginaryP
<|> rationalP
<|> matrixP
<|> functionP
<|> variableP
where variableP = Variable <$> alphaStringP
functionP = Function <$> alphaStringP <*> parensExprP
parensExprP = parenthesize exprP
|