summaryrefslogtreecommitdiff
path: root/kattis-kth/tilda-enkelsyntax/EnkelSyntax.hs
diff options
context:
space:
mode:
Diffstat (limited to 'kattis-kth/tilda-enkelsyntax/EnkelSyntax.hs')
-rw-r--r--kattis-kth/tilda-enkelsyntax/EnkelSyntax.hs42
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)