By default, the tt(%polymorphic) directive declares a strongly typed enum:
tt(enum class Tag__), and code generated by bic() always uses the tt(Tag__)
scope when referring to tag identifiers. It is often possible (by
pre-associating tokens with tags, using tt(%type) directives) to avoid having
to use tags in user-code.

If tags em(are) explicitly used, then they must be prefixed with the tt(Tag__)
scope. Before the arrival of the C++-11 standard strongly typed enumerations
didn't exist, and explicit enum-type scope prefixes were usually omitted.
This works fine, as long as there are no name-conflicts: parser-tokens, other
enumerations or variables could use identifiers also used by tt(enum
Tag__). This results in compilation errors that can simply be prevented using
strongly typed enumerations.

The tt(%weak-tags) directive can be specified when the tt(Tag__) enum should
em(not) be declared as a strongly typed enum. When in doubt, don't use this
directive and stick to using the strongly typed tt(Tag__) enum. When using
tt(%weak-tags) be prepared for compilation errors caused by name collisions.
