diff options
author | Mathias Magnusson <mathias@magnusson.space> | 2024-02-28 18:00:30 +0100 |
---|---|---|
committer | Mathias Magnusson <mathias@magnusson.space> | 2024-02-28 18:00:30 +0100 |
commit | 4e8ac826929117f95baeb37e1518773d1169d900 (patch) | |
tree | 8d83639b336ece6422e9f3391655db12f30d6013 /kattis-kth/tilda-enkelsyntax | |
parent | d4fcb8a4a815ce8c888c3e06330e9cff71e3c312 (diff) | |
download | programming-problem-solving-4e8ac826929117f95baeb37e1518773d1169d900.tar.gz |
Random uncommited stuff
Diffstat (limited to 'kattis-kth/tilda-enkelsyntax')
-rw-r--r-- | kattis-kth/tilda-enkelsyntax/EnkelSyntax.hs | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/kattis-kth/tilda-enkelsyntax/EnkelSyntax.hs b/kattis-kth/tilda-enkelsyntax/EnkelSyntax.hs new file mode 100644 index 0000000..eeaa82e --- /dev/null +++ b/kattis-kth/tilda-enkelsyntax/EnkelSyntax.hs @@ -0,0 +1,42 @@ +import Data.List (elemIndex) + +type Parser = String -> Either String String + +parseMolekyl :: Parser +parseMolekyl cs = parseAtom cs >>= parseNum + +parseAtom :: Parser +parseAtom cs = parseBig cs >>= parseSmall + +parseBig :: Parser +parseBig (c : cs) = + if c `elem` "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + then Right cs + else Left $ "Saknad stor bokstav vid radslutet " ++ (c : cs) +parseBig "" = Left "Saknad stor bokstav vid radslutet " + +parseSmall :: Parser +parseSmall (c : cs) = + Right $ + if c `elem` "abcdefghijklmnopqrstuvwxyz" + then cs + else c : cs +parseSmall "" = Right "" + +parseNum :: Parser +parseNum "" = Right "" +parseNum cs = + let (x, cs') = parseNum' 0 cs + in if x >= 2 + then Right cs' + else Left ("För litet tal vid radslutet " ++ cs') + where + parseNum' n (c : cs) = case c `elemIndex` "0123456789" of + Just x -> parseNum' (n * 10 + x) cs + Nothing -> (n, c : cs) + parseNum' n "" = (n, "") + +output (Right _) = "Formeln är syntaktiskt korrekt" +output (Left s) = s + +main = interact (unlines . map (output . parseMolekyl) . takeWhile (/= "#") . lines) |