Advertisement
Guest User

Issue with Parsec and caseof

a guest
Sep 8th, 2012
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Text.Parsec
  2. import Text.Parsec.String
  3. import Text.Parsec.Expr
  4. import Text.Parsec.Token
  5. import Text.Parsec.Language
  6.  
  7. data Field = Field {  name :: String
  8.                     , dataType :: String
  9.                     , flag :: String
  10.                     , format :: String}
  11.     deriving (Show, Eq)
  12.  
  13. getFieldName :: Parser String
  14. getFieldName = many1 $ alphaNum <|> char '-'
  15.  
  16. getDataType :: Parser String
  17. getDataType = many1 $ alphaNum <|> oneOf "-[]"
  18.  
  19. getFlag :: Parser String
  20. getFlag = many1 $ oneOf "vimc" --view component, index member,
  21.                                --mandatory, and case sensitive are the
  22.                                --flags used by progress
  23. getFormat :: Parser String
  24. getFormat = many $ noneOf " \n"  
  25.  
  26. fieldsWithoutFlags :: Parser Field
  27. fieldsWithoutFlags = do
  28.             iName <- getFieldName
  29.             spaces
  30.             iType <- getDataType
  31.             spaces
  32.             iFormat <- getFormat
  33.             newline
  34.             return $ Field {name = iName
  35.                             , dataType = iType
  36.                             , flag = ""
  37.                             , format = iFormat}
  38.  
  39. fieldsWithFlags :: Parser Field
  40. fieldsWithFlags = do
  41.             iName <- getFieldName
  42.             spaces
  43.             iType <- getDataType
  44.             spaces
  45.             iFlag <- getFlag
  46.             spaces
  47.             iFormat <- getFormat
  48.             return $ Field {name = iName
  49.                             , dataType = iType
  50.                             , flag = iFlag
  51.                             , format = iFormat}
  52.  
  53. testLine = "system-id                   char       i   X(12)"
  54.  
  55. --Setup I'm trying to get working
  56. --field :: Either ParseError Field
  57. --field = case parse fieldsWithFlags "(test)" testLine of
  58.             --Left err  -> noFlags
  59.             --Right res -> return Right res
  60.        --where noFlags = case parse fieldsWithoutFlags "(test)" testLine of
  61.                             --Left err -> return Left err
  62.                             --Right res -> return Right res
  63.  
  64. --Ideal:
  65. --main = case field of
  66.            --Left err -> print err
  67.            --Right res -> print res
  68.  
  69. -- Latest working
  70. main = case parse fieldsWithFlags "(test)" testLine of
  71.             Left err  -> noFlags
  72.             Right res -> print res
  73.        where noFlags = case parse fieldsWithoutFlags "(test)" testLine of
  74.                             Left err -> print err
  75.                             Right res -> print res
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement