Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

Parser.hs 1.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. module Day7.Parser (
  2. parseTerminalLines,
  3. TerminalCommand (..),
  4. ListingEntry (..),
  5. DirName,
  6. FileName,
  7. Size
  8. ) where
  9. import Text.ParserCombinators.Parsec
  10. type DirName = String
  11. type FileName = String
  12. type Size = Int
  13. data ListingEntry = DirListing DirName | FileListing FileName Size
  14. deriving (Show, Eq)
  15. data TerminalCommand = In DirName | Out | Root | Listing [ListingEntry]
  16. deriving (Show, Eq)
  17. parseTerminalLines :: String -> Either ParseError [TerminalCommand]
  18. parseTerminalLines = parse terminal "(error)"
  19. terminal :: GenParser Char st [TerminalCommand]
  20. terminal = many command
  21. command :: GenParser Char st TerminalCommand
  22. command = do
  23. _ <- string "$ "
  24. cd <|> ls
  25. ls :: GenParser Char st TerminalCommand
  26. ls = do
  27. _ <- string "ls\n"
  28. entries <- many listingEntry
  29. return $ Listing entries
  30. listingEntry :: GenParser Char st ListingEntry
  31. listingEntry = dirListing <|> fileListing
  32. dirListing :: GenParser Char st ListingEntry
  33. dirListing = do
  34. _ <- string "dir "
  35. dirName <- many $ noneOf "\n"
  36. _ <- char '\n'
  37. return $ DirListing dirName
  38. fileListing :: GenParser Char st ListingEntry
  39. fileListing = do
  40. fileSize <- many1 digit
  41. _ <- char ' '
  42. fileName <- many $ noneOf "\n"
  43. _ <- char '\n'
  44. return $ FileListing fileName (read fileSize)
  45. cd :: GenParser Char st TerminalCommand
  46. cd = do
  47. _ <- string "cd "
  48. name <- many $ noneOf "\n"
  49. _ <- char '\n'
  50. return (nameToDir name)
  51. nameToDir :: DirName -> TerminalCommand
  52. nameToDir "/" = Root
  53. nameToDir ".." = Out
  54. nameToDir ds = In ds