From df5d3f05ead68a6cdecfeccecadce45fd4b574fd Mon Sep 17 00:00:00 2001 From: Charles Date: Tue, 10 Mar 2020 14:57:47 +0100 Subject: Solution commentary, parsing free from entrie (i.e X^1, 2*X) bonus --- src/parser.hs | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) (limited to 'src/parser.hs') 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) -- cgit