aboutsummaryrefslogtreecommitdiff
path: root/src/parser.hs
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-03-10 14:57:47 +0100
committerCharles <sircharlesaze@gmail.com>2020-03-10 14:57:47 +0100
commitdf5d3f05ead68a6cdecfeccecadce45fd4b574fd (patch)
treed9e6a9733bf7fd086044fbe29ff5fb660ade2311 /src/parser.hs
parente5ba91f99722d047f90f94a710d77344db36e110 (diff)
downloadcomputorv1-df5d3f05ead68a6cdecfeccecadce45fd4b574fd.tar.gz
computorv1-df5d3f05ead68a6cdecfeccecadce45fd4b574fd.tar.bz2
computorv1-df5d3f05ead68a6cdecfeccecadce45fd4b574fd.zip
Solution commentary, parsing free from entrie (i.e X^1, 2*X) bonus
Diffstat (limited to 'src/parser.hs')
-rw-r--r--src/parser.hs29
1 files changed, 21 insertions, 8 deletions
diff --git a/src/parser.hs b/src/parser.hs
index 09b0421..bfab053 100644
--- a/src/parser.hs
+++ b/src/parser.hs
@@ -72,21 +72,34 @@ intP = prefixedIntP <|> (read <$> digitsP)
naturalP :: Parser Int
naturalP = read <$> digitsP
+floatPositiveP :: Parser Float
+floatPositiveP = (f <$> digitsP <*> charP '.' <*> digitsP) <|> (read <$> digitsP)
+ where f pos dot dec = read $ pos ++ [dot] ++ dec
+
signP :: Parser Char
signP = charP '-' <|> charP '+'
+optionnal :: Parser a -> a -> Parser a
+optionnal p placeholder = p <|> pure placeholder
+
-- Equation parsers
unsignedTermP :: Parser Term
-unsignedTermP = notConstantP <|> constantP
- where constantP = (\c -> Term (fromIntegral c) 0) <$> naturalP
- notConstantP = (\coef exp -> Term (fromIntegral coef) exp)
- <$> naturalP <*> (between *> naturalP)
- where between = spacesP *> charP '*' *>
- spacesP *> charP 'X' *>
- spacesP *> charP '^' *>
- spacesP
+unsignedTermP = fullP <|> varExpP <|> varConstP <|> constP
+ where
+ -- 1 * X ^ 1
+ fullP = (\c e -> Term c e) <$> floatPositiveP <* mulP <* varP <* expP <*> naturalP
+ -- X ^ 1
+ varExpP = (\e -> Term 1 e) <$> (varP *> expP *> naturalP)
+ -- 1 * X
+ varConstP = (\c -> Term c 1) <$> floatPositiveP <* mulP <* varP
+ -- 1
+ constP = (\c -> Term c 0) <$> floatPositiveP
+
+ mulP = spacesP *> charP '*' *> spacesP
+ varP = spacesP *> charP 'X' *> spacesP
+ expP = spacesP *> charP '^' *> spacesP
signedTermP :: Parser Term
signedTermP = signF <$> signP <*> (spacesP *> unsignedTermP)