Use a dynamically defined grammar to parse a source code to parse trees.
We read the grammar from grammar.txt and convert it to predefined grammar structure on execution of the driver. Subsequently the source code is read and converted to a parse tree. Also, type checking can be done to report errors. Auxillary functions are provided to examine the output.