rem: *(   preprocessor    [process("preprocessor", self.out)]
add: *space_p >> *(  preprocessor    [process("preprocessor", self.out)]
context:         definition(cpp_to_html const& self)        {            program                =               *(   preprocessor    [process("preprocessor", self.out)]                |   comment         [process("comment", self.out)]                |   keyword         [process("keyword", self.out)]                |   identifier      [process("identifier", self.out)]                |   special         [process("special", self.out)]                |   string_         [process("string", self.out)]                |   literal         [process("literal", self.out)]                |   number          [process("number", self.out)]                |   anychar_p       [unexpected_char(self.out)]                )                ;            preprocessor                =   '#' >> ((alpha_p | '_') >> *(alnum_p | '_'))                    >> *space_p                ;            comment                =   +((comment_p("//") | comment_p("/*", "*/"))                    >> *space_p)                ;            keyword                =   keyword_ >> (eps_p - (alnum_p | '_')) >> *space_p                ;   // make sure we recognize whole words only            keyword_                =   "and_eq", "and", "asm", "auto", "bitand", "bitor",                    "bool", "break", "case", "catch", "char", "class",                    "compl", "const_cast", "const", "continue", "default",                    "delete", "do", "double", "dynamic_cast",  "else",                    "enum", "explicit", "export", "extern", "false",                    "float", "for", "friend", "goto", "if", "inline",                    "int", "long", "mutable", "namespace", "new", "not_eq",                    "not", "operator", "or_eq", "or", "private",                    "protected", "public", "register", "reinterpret_cast",                    "return", "short", "signed", "sizeof", "static",                    "static_cast", "struct", "switch", "template", "this",                    "throw", "true", "try", "typedef", "typeid",                    "typename", "union", "unsigned", "using", "virtual",                    "void", "volatile", "wchar_t", "while", "xor_eq", "xor"                ;            special                =   +(chset_p("~!%^&*()+={[}]:;,<.>?/|\\-") >> *space_p)                ;            string_                =   !as_lower_d['l'] >> confix_p('"', *c_escape_ch_p, '"')                    >> *space_p                ;            literal                =   !as_lower_d['l'] >> confix_p('\'', *c_escape_ch_p, '\'')                    >> *space_p                ;            number                =   (   real_p                    |   as_lower_d["0x"] >> hex_p                    |   '0' >> oct_p                    )                    >>  *as_lower_d[chset_p("ldfu")]                    >>  *space_p                ;            identifier                =   ((alpha_p | '_') >> *(alnum_p | '_'))                    >> *space_p                ;        }