diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-03-10 12:35:27 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-03-10 12:35:27 +0100 |
| commit | e5ba91f99722d047f90f94a710d77344db36e110 (patch) | |
| tree | 4c9b2c0e474eb1279d23a88623f0ee8b53391f50 /src/parser.hs | |
| parent | 101739991c2ca919e3bb150b6df0041b27cf75a1 (diff) | |
| download | computorv1-e5ba91f99722d047f90f94a710d77344db36e110.tar.gz computorv1-e5ba91f99722d047f90f94a710d77344db36e110.tar.bz2 computorv1-e5ba91f99722d047f90f94a710d77344db36e110.zip | |
Edge case handling in parsing and equation solving
Diffstat (limited to 'src/parser.hs')
| -rw-r--r-- | src/parser.hs | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/src/parser.hs b/src/parser.hs index 6c2b8af..09b0421 100644 --- a/src/parser.hs +++ b/src/parser.hs @@ -59,32 +59,45 @@ spacesP :: Parser String spacesP = many (satisfy isSpace) sepBy :: Parser a -> Parser b -> Parser [a] -sepBy x sep = (:) <$> x <*> many (sep *> x) +sepBy x sep = many (sep *> x) - -intP :: Parser Int -intP = read <$> numStr +prefixedIntP :: Parser Int +prefixedIntP = read <$> numStr where numStr = ((:) <$> charP '-' <*> (spacesP *> digitsP)) <|> (charP '+' *> spacesP *> digitsP) - <|> digitsP + +intP :: Parser Int +intP = prefixedIntP <|> (read <$> digitsP) naturalP :: Parser Int naturalP = read <$> digitsP +signP :: Parser Char +signP = charP '-' <|> charP '+' + -- Equation parsers -termP :: Parser Term -termP = notConstantP <|> constantP - where constantP = (\c -> Term (fromIntegral c) 0) <$> intP + +unsignedTermP :: Parser Term +unsignedTermP = notConstantP <|> constantP + where constantP = (\c -> Term (fromIntegral c) 0) <$> naturalP notConstantP = (\coef exp -> Term (fromIntegral coef) exp) - <$> intP <*> (between *> naturalP) + <$> naturalP <*> (between *> naturalP) where between = spacesP *> charP '*' *> spacesP *> charP 'X' *> spacesP *> charP '^' *> spacesP +signedTermP :: Parser Term +signedTermP = signF <$> signP <*> (spacesP *> unsignedTermP) + where signF '-' (Term c e) = Term (-c) e + signF _ t = t + +firstTermP :: Parser Term +firstTermP = signedTermP <|> unsignedTermP + polynomialP :: Parser Polynomial -polynomialP = sepBy termP spacesP +polynomialP = ((:) <$> firstTermP <*> (spacesP *> (sepBy signedTermP spacesP))) equationP :: Parser Equation equationP = (\l r -> Equation l r) |
