import Text.ParserCombinators.Parsec data Region = UnitCircle | Scale String Region | Union Region Region deriving Show parseRegion :: Parser Region parseRegion = do (try parseUnitCircle) <|> parseScale <|> parseUnion parseUnitCircle :: Parser Region parseUnitCircle = do string "unitcircle" return UnitCircle parseScale :: Parser Region parseScale = do string "scale" char '(' r1 <- number char ',' r2 <- parseRegion return $ Scale r1 r2 parseUnion = do string "union" char '(' r1 <- parseRegion char ',' r2 <- parseRegion return $ Union r1 r2 number :: Parser String number = many1 digit