aboutsummaryrefslogtreecommitdiff
path: root/src/parser/Expr.hs
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