diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-03-10 14:57:47 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-03-10 14:57:47 +0100 |
| commit | df5d3f05ead68a6cdecfeccecadce45fd4b574fd (patch) | |
| tree | d9e6a9733bf7fd086044fbe29ff5fb660ade2311 /src/parser.hs | |
| parent | e5ba91f99722d047f90f94a710d77344db36e110 (diff) | |
| download | computorv1-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.hs | 29 |
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) |
