summaryrefslogtreecommitdiff
path: root/kattis-kth/tilda-enkelsyntax/EnkelSyntax.hs
blob: eeaa82e8f459c3d5058fe330dcb73b589170fa58 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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)