{- |
* This is the fifth assignment for IB016, semester spring 2015.
* Name: Name Surname
* UID: 123456
== Json parser
Your task is to implement the full JSON parser according to the format
specification provided at . Use @Parsec@ for
constructing the parser.
For simplicity, you may assume we are using common @String@ as input,
@()@ as the user state and @Identity@ as the underlying monad -- that is,
you can use the @Parser@ type provided by module @Text.Parsec.String@.
If the provided input holds a valid JSON (a valid object or array
at the top level), the parser should return it as a JSON tree in your own
user-defined data type. If the input is invalid, the parse error should
be returned.
Even though you are only prescribed the behaviour of the @main@ function,
try to have a reasonable (flexible, modular) design of the module.
Any documentation for your own internal functions is very welcome.
=== Implementation notes
* Adhere strictly to the specification from website.
No deviations such as missing quote marks around strings should be accepted.
* For simplicity, you can consider all numbers in the JSON
being of the type @Double@ (even if they do not have the decimal part).
* To parse basic types, you can use the @read@ function or equivalent
(for example @readLitChar@ for constructing Unicode characters).
* You can specify the JSON data type as you see fit.
However, it should not allow for construction of invalid JSON objects.
* If you choose not to implement the bonus, an automatically derived
@Show@ instance for the JSON type is sufficient to use in @main@.
=== Bonus: pretty-printer
As a bonus, try to implement a reasonable pretty-printer for the JSON type
you define. You can use the traditional conventions for displaying
JSON objects on the web. If implemented, use this pretty-printer
in the @main@ function after a successful parse.
The pretty-printer should not be the @Show@ instance (this instance should
be derived automatically to retain all metadata of the used types).
-}
module Main ( main ) where
import Text.Parsec
import System.Environment ( getArgs )
-- | Parse the given file as JSON printing the result.
-- In case of successful parse, print the parsed JSON object.
-- In case of parse failure, print the error.
-- The filename is given as the only command line argument.
-- If there are less/more arguments, display short usage info and exit.
-- You do not have to check if the file exists.
main :: IO ()
main = undefined