Now that the tt(Semantic) class template has been developed it's time to put
it to use in the tt(Parser) class. The parser's semantic value is
tt(spSemBase). The parser's base class must be informed about this type, for
which the tt(%baseclass-preinclude) directive is used. All other
directives are standard and do not require further explanations:
        verbinclude(//HEAD poly2/parser/grammar)

The grammar's rules simply consist of a series of tt(rule) nonterminals:
        verbinclude(//RULES poly2/parser/grammar)

tt(Int) values are stored in tt(Semantic<Tag::INT>) objects, text is stored in
tt(Semantic<Tag::TEXT>) values:
        verbinclude(//INT poly2/parser/grammar)

Comma separated lists of arguments are processed as follows: the first
argument is stored in a tt(Semantic<Tag::VECTOR>); additional values are added
to the vector using tt(vector::push_back). Note that we've defined the vector
as mutable: addition of values to the vector is OK, but the values themselves
remain as-is, and so the vector stores shared pointers to
tt(SemBase const) values:
        verbinclude(//ARGS poly2/parser/grammar)

The definition of the tt(rule) production rule completes our little grammar:
an alternative suggesting an assignment echoes the received names and values,
and an alternative suggesting a function call uses a support member
tt(display) to display the received name and arguments:
        verbinclude(//RULE poly2/parser/grammar)
