Fix strings

HTML comments are recognized.

HTML attribute names may contain anything except spaces, '>', and '='.

`<xmp>` and `<listing>` are supported.

Unquoted attribute values may contain `\ `, which is not stored as a
whitespace character.

Two braces in different strings do not form a substitution string.
Lex code fragments

If a keyword which can only appear inside a function or method appears
at the root level, assume this is a code fragment and change the current
state to within a function definition.