main.cpp: Improve user interface

- Add an extented message when the program is run with --help or -h
- Add a -p option to specify sintactical analysis
- Add the option for the user to use long option names
    (--lexer and --parser in addition to -l and -p)
semantic_analyser.h: Add class SemanticAnalyser

This class concentrates the task of iterate through all syntactic
structures produced by the Parser and populating the
GlobalSymbolTable, using the functions defined in tree_build.h.

For consistency with the Lexer and the Parser, the SemanticAnalyser
is a model of JavaIterator.
semantic_analyser.cpp: Implement the SemanticAnalyser.
main.cpp: Add semantic analysis to the main program.
utility/metaoperators.hpp: removed trailing whitespace.
Implement semantic_error

exceptions.h: Add complete implementation of the class;
tree_build.cpp: Corrected constructor call.
Add missing includes

Affected files: exceptions.h, semantic_analyser.cpp,
         symbol_table.cpp, tree_build.cpp.
Add forward declarations to classes in operator.h in operator_fwd.h

By putting pointers in classes below TreeNodeBody to NullaryOperator,
UnaryOperator and BinaryOperator, we create a cyclical dependence:
TreeNodeBody references Operators that references OperatorOverload
that references TreeNodeBody (indirectly through OperatorVariable).

This headers forward-declare every class and template in operator.h
to break the cycle.

operator_fwd.h: Add forward declarations to all classes of operator.h
ast.h: Include operator_fwd.h and fix a typo.
Fixed typos

main.cpp: add a semicolon and wrong function names;
semantic_analyser.cpp: wrong class names and exception type
    and extra '&&' at end of type;
tree_build.cpp: extra '*' at end of type.
Extend interface Printable with method clone

This method is used mainly by the dynamic programming algorithm
in tree_build.cpp.

printable.h: Add refered method;
ast.h, operator.h: Add the method in all classes that
    derive from Printable.
symbol.h: add constructors for Symbol and Category

These constructors are needed in order to use std::make_unique<Category>
in symbol.cpp, in function Category::next().
symbol_table.h: Change signature of insertOverload to work with formats

Instead of using Token::XF, Token::YFX etc. enumeration constants, for
convenience we will use the corresponding format strings "XF", "YFX".

Also, the type of the parameter 'priority' was changed to 'unsigned'.

symbol_table.cpp: change corresponding implementation.
symbol_table.cpp: Use std::unordered_map in GlobalSymbolTable

Altough this sofware will not be efficient, using a hash map
suits more the role of a symbol table.
We were using std::map previously.
Rename NumberVariable to NumericVariable for consistency with NumericBody

Affected files: ast.cpp, ast.h, parser.cpp.
ast.h: Make the virtual clone functions of several classes explicit

Affected classes: SignatureToken, OperatorVariable, OperatorBody,
TreeNodeBody and Statement. Note all of them are abstract classes.

This allows us to covariantly change the return type to pointers
to these derived classes.
ast.h: Fix TreeNodeBody constructor reordering warning.
semantic_analyser.cpp: Correct GlobalSymbolTable::insertOverload call.
operator.h: Make OperatorOverload inherit from Statement.
operator.h: Fix type mismatch in OperatorBase::insert method

We use the contrived '&dinamic_cast<type&>( *ptr )' wording to
benefit from std::bad_cast throws in case of accidental mismatch.
operator.h: Add a name field in OperatorOverload.