+ case '.':
+ MAYBE_PROLOG
+ MAYBE('.', T_DOTDOTDOT)
+ ELSE_CODE(
+ put_back(c);
+ c = '.';
+ lexer_token.kind = '.';
+ )
+ ELSE('.')
+ case '&':
+ MAYBE_PROLOG
+ MAYBE('&', T_ANDAND)
+ MAYBE('=', T_ANDEQUAL)
+ ELSE('&')
+ case '*':
+ MAYBE_PROLOG
+ MAYBE('=', T_ASTERISKEQUAL)
+ ELSE('*')
+ case '+':
+ MAYBE_PROLOG
+ MAYBE('+', T_PLUSPLUS)
+ MAYBE('=', T_PLUSEQUAL)
+ ELSE('+')
+ case '-':
+ MAYBE_PROLOG
+ MAYBE('>', T_MINUSGREATER)
+ MAYBE('-', T_MINUSMINUS)
+ MAYBE('=', T_MINUSEQUAL)
+ ELSE('-')
+ case '!':
+ MAYBE_PROLOG
+ MAYBE('=', T_EXCLAMATIONMARKEQUAL)
+ ELSE('!')
+ case '/':
+ MAYBE_PROLOG
+ MAYBE('=', T_SLASHEQUAL)
+ case '*':
+ next_char();
+ skip_multiline_comment();
+ lexer_next_preprocessing_token();
+ return;
+ case '/':
+ next_char();
+ skip_line_comment();
+ lexer_next_preprocessing_token();
+ return;
+ ELSE('/')
+ case '%':
+ MAYBE_PROLOG
+ MAYBE('>', '}')
+ MAYBE('=', T_PERCENTEQUAL)
+ case ':':
+ MAYBE_PROLOG
+ case '%':
+ MAYBE_PROLOG
+ MAYBE(':', T_HASHHASH)
+ ELSE_CODE(
+ put_back(c);
+ c = '%';
+ lexer_token.kind = '#';
+ )
+ ELSE('#')
+ ELSE('%')
+ case '<':
+ MAYBE_PROLOG
+ MAYBE(':', '[')
+ MAYBE('%', '{')
+ MAYBE('=', T_LESSEQUAL)
+ case '<':
+ MAYBE_PROLOG
+ MAYBE('=', T_LESSLESSEQUAL)
+ ELSE(T_LESSLESS)
+ ELSE('<')
+ case '>':
+ MAYBE_PROLOG
+ MAYBE('=', T_GREATEREQUAL)
+ case '>':
+ MAYBE_PROLOG
+ MAYBE('=', T_GREATERGREATEREQUAL)
+ ELSE(T_GREATERGREATER)
+ ELSE('>')
+ case '^':
+ MAYBE_PROLOG
+ MAYBE('=', T_CARETEQUAL)
+ ELSE('^')
+ case '|':
+ MAYBE_PROLOG
+ MAYBE('=', T_PIPEEQUAL)
+ MAYBE('|', T_PIPEPIPE)
+ ELSE('|')
+ case ':':
+ MAYBE_PROLOG
+ MAYBE('>', ']')
+ MAYBE_MODE(':', T_COLONCOLON, _CXX)
+ ELSE(':')
+ case '=':
+ MAYBE_PROLOG
+ MAYBE('=', T_EQUALEQUAL)
+ ELSE('=')
+ case '#':
+ MAYBE_PROLOG
+ MAYBE('#', T_HASHHASH)
+ ELSE('#')
+
+ case '?':
+ case '[':
+ case ']':
+ case '(':
+ case ')':
+ case '{':
+ case '}':
+ case '~':
+ case ';':
+ case ',':
+ case '\\':
+ lexer_token.kind = c;
+ next_char();
+ return;
+
+ case EOF:
+ lexer_token.kind = T_EOF;
+ return;
+
+ default:
+dollar_sign:
+ errorf(&lexer_pos, "unknown character '%c' found", c);
+ next_char();
+ lexer_token.kind = T_ERROR;