A lot of tidying up of the parsing code in pepapot.pepapot. This is mostly using the trick of moving the grammar code (which defines the parser) for a given node kind defined within the class definition corresponding to the node kind. This means that the module namespace is not quite so cluttered. Which in turn means I can use slightly nicer names for sub-parts of the grammar since I have to worry less about clashing of names. This also uses the trick of a 'classmethod' to define the parser action for the given node kind (which will likely produce an instance of the class being defined). This is great because it means we can keep that parser action code next to the grammar defining code, because if you change the grammar you likely need to change the parser action.
A lot of tidying up of the parsing code in pepapot.pepapot. This is mostly using the trick of moving the grammar code (which defines the parser) for a given node kind defined within the class definition corresponding to the node kind. This means that the module namespace is not quite so cluttered. Which in turn means I can use slightly nicer names for sub-parts of the grammar since I have to worry less about clashing of names. This also uses the trick of a 'classmethod' to define the parser action for the given node kind (which will likely produce an instance of the class being defined). This is great because it means we can keep that parser action code next to the grammar defining code, because if you change the grammar you likely need to change the parser action.

allanderek/pepapot,allanderek/pepapot,ageorgou/pepapot,ageorgou/pepapot