parent
943590c669
commit
9b76010418
@ -1,282 +0,0 @@ |
|||||||
module ParserMaths exposing (evaluer, evaluerBis, expr, montrerErreurs, parseMaths) |
|
||||||
|
|
||||||
import Fraction as F exposing (Fraction, Resultat, fraction, map2) |
|
||||||
import Maybe as M |
|
||||||
import Parser exposing (..) |
|
||||||
import Set |
|
||||||
|
|
||||||
|
|
||||||
montrerErreurs : String -> List DeadEnd -> String |
|
||||||
montrerErreurs source errs = |
|
||||||
case List.head errs of |
|
||||||
Nothing -> |
|
||||||
"" |
|
||||||
|
|
||||||
Just firstErr -> |
|
||||||
source |
|
||||||
++ "\n" |
|
||||||
++ String.repeat (firstErr.col - 1) " " |
|
||||||
++ "^" |
|
||||||
++ "\nL'algorithme attendait :" |
|
||||||
++ String.join |
|
||||||
" ou " |
|
||||||
(List.map montrerAttendu errs) |
|
||||||
|
|
||||||
|
|
||||||
montrerAttendu : DeadEnd -> String |
|
||||||
montrerAttendu err = |
|
||||||
case err.problem of |
|
||||||
ExpectingNumber -> |
|
||||||
"un nombre entier" |
|
||||||
|
|
||||||
ExpectingSymbol s -> |
|
||||||
"un \"" ++ s ++ "\"" |
|
||||||
|
|
||||||
_ -> |
|
||||||
"une expression" |
|
||||||
|
|
||||||
|
|
||||||
evaluerBis : Expr -> Fraction |
|
||||||
evaluerBis expression = |
|
||||||
case evaluer expression of |
|
||||||
Err _ -> |
|
||||||
{ numerateur = 666, denominateur = 1 } |
|
||||||
|
|
||||||
Ok a -> |
|
||||||
a |
|
||||||
|
|
||||||
|
|
||||||
evaluer : Expr -> Resultat |
|
||||||
evaluer expression = |
|
||||||
case expression of |
|
||||||
Add a b -> |
|
||||||
map2 F.somme (evaluer a) (evaluer b) |
|
||||||
|
|
||||||
Sub a b -> |
|
||||||
map2 F.difference (evaluer a) (evaluer b) |
|
||||||
|
|
||||||
Mul a b -> |
|
||||||
map2 F.produit (evaluer a) (evaluer b) |
|
||||||
|
|
||||||
Div a b -> |
|
||||||
map2 F.quotient (evaluer a) (evaluer b) |
|
||||||
|
|
||||||
Exp a b -> |
|
||||||
map2 F.exp (evaluer a) (evaluer b) |
|
||||||
|
|
||||||
Neg a -> |
|
||||||
Result.map F.oppose (evaluer a) |
|
||||||
|
|
||||||
Grouping l -> |
|
||||||
evaluer l |
|
||||||
|
|
||||||
Entier n -> |
|
||||||
F.fraction n 1 |
|
||||||
|
|
||||||
Poly a_i x -> |
|
||||||
Err "Les polynômes ne sont pas encore pris en charge." |
|
||||||
|
|
||||||
|
|
||||||
type Expr |
|
||||||
= Add Expr Expr |
|
||||||
| Sub Expr Expr |
|
||||||
| Mul Expr Expr |
|
||||||
| Div Expr Expr |
|
||||||
| Exp Expr Expr |
|
||||||
| Neg Expr |
|
||||||
| Entier Int |
|
||||||
| Grouping Expr |
|
||||||
| Poly (List Expr) String |
|
||||||
|
|
||||||
|
|
||||||
parseMaths : String -> Result (List DeadEnd) Expr |
|
||||||
parseMaths source = |
|
||||||
run expr source |
|
||||||
|
|
||||||
|
|
||||||
expr : Parser Expr |
|
||||||
expr = |
|
||||||
add |
|
||||||
|
|
||||||
|
|
||||||
type Operator |
|
||||||
= MulOp |
|
||||||
| DivOp |
|
||||||
| AddOp |
|
||||||
| SubOp |
|
||||||
| ExpOp |
|
||||||
|
|
||||||
|
|
||||||
type Operand |
|
||||||
= NoOperand |
|
||||||
| Operand Operator Expr |
|
||||||
|
|
||||||
|
|
||||||
{-| En quelque sorte, décurryfie une expression binaire |
|
||||||
binary e\_1 (Operand MulOp e\_2) == Mul e\_1 e\_2 |
|
||||||
-} |
|
||||||
binary : Expr -> Operand -> Expr |
|
||||||
binary a b = |
|
||||||
case b of |
|
||||||
NoOperand -> |
|
||||||
a |
|
||||||
|
|
||||||
Operand op e -> |
|
||||||
case op of |
|
||||||
MulOp -> |
|
||||||
Mul a e |
|
||||||
|
|
||||||
DivOp -> |
|
||||||
Div a e |
|
||||||
|
|
||||||
AddOp -> |
|
||||||
Add a e |
|
||||||
|
|
||||||
SubOp -> |
|
||||||
Sub a e |
|
||||||
|
|
||||||
ExpOp -> |
|
||||||
Exp a e |
|
||||||
|
|
||||||
|
|
||||||
add : Parser Expr |
|
||||||
add = |
|
||||||
succeed |
|
||||||
foldBinary |
|
||||||
|= mul |
|
||||||
|. spaces |
|
||||||
|= loop [] addHelper |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- |
|
||||||
|
|
||||||
|
|
||||||
foldBinary : Expr -> List Operand -> Expr |
|
||||||
foldBinary left operands = |
|
||||||
List.foldr |
|
||||||
(\operand expression -> binary expression operand) |
|
||||||
left |
|
||||||
operands |
|
||||||
|
|
||||||
|
|
||||||
addHelper : List Operand -> Parser (Step (List Operand) (List Operand)) |
|
||||||
addHelper operands = |
|
||||||
oneOf |
|
||||||
[ succeed (\right -> Loop (Operand AddOp right :: operands)) |
|
||||||
|. symbol "+" |
|
||||||
|. spaces |
|
||||||
|= lazy (\_ -> mul) |
|
||||||
, succeed (\right -> Loop (Operand SubOp right :: operands)) |
|
||||||
|. symbol "-" |
|
||||||
|. spaces |
|
||||||
|= lazy (\_ -> mul) |
|
||||||
, succeed () |
|
||||||
|> map (\_ -> Done operands) |
|
||||||
] |
|
||||||
|
|
||||||
|
|
||||||
mul : Parser Expr |
|
||||||
mul = |
|
||||||
succeed |
|
||||||
foldBinary |
|
||||||
|= exp |
|
||||||
|. spaces |
|
||||||
|= loop [] mulHelper |
|
||||||
|
|
||||||
|
|
||||||
mulHelper : List Operand -> Parser (Step (List Operand) (List Operand)) |
|
||||||
mulHelper operands = |
|
||||||
oneOf |
|
||||||
[ succeed (\right -> Loop (Operand MulOp right :: operands)) |
|
||||||
|. symbol "*" |
|
||||||
|. spaces |
|
||||||
|= lazy (\_ -> exp) |
|
||||||
, succeed (\right -> Loop (Operand DivOp right :: operands)) |
|
||||||
|. symbol "/" |
|
||||||
|. spaces |
|
||||||
|= lazy (\_ -> exp) |
|
||||||
, succeed () |
|
||||||
|> map (\_ -> Done operands) |
|
||||||
] |
|
||||||
|
|
||||||
|
|
||||||
exp : Parser Expr |
|
||||||
exp = |
|
||||||
succeed |
|
||||||
binary |
|
||||||
|= primary |
|
||||||
|. spaces |
|
||||||
|= oneOf |
|
||||||
[ succeed (Operand ExpOp) |
|
||||||
|. symbol "^" |
|
||||||
|. spaces |
|
||||||
|= lazy (\_ -> exp) |
|
||||||
, succeed NoOperand |
|
||||||
] |
|
||||||
|
|
||||||
|
|
||||||
primary : Parser Expr |
|
||||||
primary = |
|
||||||
succeed |
|
||||||
(\op literal -> |
|
||||||
case op of |
|
||||||
Nothing -> |
|
||||||
literal |
|
||||||
|
|
||||||
Just _ -> |
|
||||||
Neg literal |
|
||||||
) |
|
||||||
|= oneOf |
|
||||||
[ succeed Just |
|
||||||
|= symbol "-" |
|
||||||
, succeed Nothing |
|
||||||
] |
|
||||||
|= oneOf |
|
||||||
[ grouping |
|
||||||
, poly |
|
||||||
, nombre |
|
||||||
] |
|
||||||
|
|
||||||
|
|
||||||
nombre : Parser Expr |
|
||||||
nombre = |
|
||||||
succeed Entier |
|
||||||
|= number |
|
||||||
{ int = Just identity |
|
||||||
, hex = Nothing |
|
||||||
, octal = Nothing |
|
||||||
, binary = Nothing |
|
||||||
, float = Nothing |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
poly : Parser Expr |
|
||||||
poly = |
|
||||||
succeed Poly |
|
||||||
|. keyword "Poly" |
|
||||||
|. spaces |
|
||||||
|= sequence |
|
||||||
{ start = "[" |
|
||||||
, separator = "," |
|
||||||
, end = "]" |
|
||||||
, spaces = spaces |
|
||||||
, item = lazy (\_ -> expr) |
|
||||||
, trailing = Forbidden |
|
||||||
} |
|
||||||
|. spaces |
|
||||||
|= variable |
|
||||||
{ start = \_ -> True |
|
||||||
, inner = \_ -> False |
|
||||||
, reserved = Set.fromList [] |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
grouping : Parser Expr |
|
||||||
grouping = |
|
||||||
succeed Grouping |
|
||||||
|. symbol "(" |
|
||||||
|. spaces |
|
||||||
|= lazy (\_ -> expr) |
|
||||||
|. spaces |
|
||||||
|. symbol ")" |
|
||||||
Loading…
Reference in new issue