Refactoring

  - Splitted attribute grammar semantic from data types definition.
    This allows a better design with few and well defined entry points (which will
    be addressed in the following commits). Furthermore it allows to test also
    those parts that are not meant to be public, without defining in the module
    itself unnecessary functions.