The polymorphic semantic value in fact implements a type-safe
        hi(union: polymorphic)
        emi(polymorphic semantic union).
    In bf(C++) this data type does not exist, but the parser may handle
semantic values as unions. It always knows the actual kind of semantic value
that's used at a particular point in the grammar. If not, it can inspect
tt(SemBase's) tag fields.

The parser, knowing what the actual semantic type is, may then perform
a i(downcast), resulting in a em(very) lightweight tt(SemBase) base class.

The tt(SemBase) class only requires one virtual member: an empty virtual
destructor. Downcasting is encapsulated in tt(SemBase)'s 'tt(as)'
member. Consequently, the parser, defining its semantic value as an
tt(spSembase) (i.e., a tt(shared_ptr) to a tt(Sembase), cf. section
ref(BISONSEM)), can then use constructions like
        verb(
     $1->as<Tag::STRING>()
        )
 to access the tt(std::string) that is stored in the actual semantic value to
which tt($1) points. Here is tt(SemBase)'s class interface (the implementation
of its `tt(as)' member template follows, implementations of its remaining
members are trivial):
        verbinclude(//SEMBASE poly2/sembase/sembase.h)
