The keyword_p works in the same way as the str_p parser but matches only
when the matched input is not immediately followed by one of the characters
from the set passed to the constructor of keyword_p. In the example the
"declare" can't be immediately followed by any alphabetic character, any
number or an underscore.

dynamic_distinct_parser and dynamic_distinct_directive

In some cases a set of forbidden follow-up characters is not sufficient.
For example ASN.1 naming conventions allows identifiers to contain dashes,
but not double dashes (which marks the beginning of a comment).
Furthermore, identifiers can't end with a dash. So, a matched keyword can't
be followed by any alphanumeric character or exactly one dash, but can be
followed by two dashes.

This is when dynamic_distinct_parser and the dynamic_distinct_directive come into play. The constructor of the dynamic_distinct_parser accepts a
parser which matches any input that must NOT follow the keyword.