From 4e8ac826929117f95baeb37e1518773d1169d900 Mon Sep 17 00:00:00 2001 From: Mathias Magnusson Date: Wed, 28 Feb 2024 18:00:30 +0100 Subject: Random uncommited stuff --- kattis-kth/tilda-enkelsyntax/EnkelSyntax.hs | 42 +++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 kattis-kth/tilda-enkelsyntax/EnkelSyntax.hs (limited to 'kattis-kth/tilda-enkelsyntax') 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) -- cgit v1.2.3