// auto generated by meta.c typedef enum { TOK_EOF, TOK_ERROR, TOK_IDENT, TOK_INT, TOK_FLOAT, TOK_CHAR, TOK_STRING, TOK_LPAREN, TOK_RPAREN, TOK_LBRACKET, TOK_RBRACKET, TOK_LBRACE, TOK_RBRACE, TOK_COMMA, TOK_DOT, TOK_ARROW, TOK_ELLIPSIS, TOK_COLON, TOK_SEMICOLON, TOK_QUESTION, TOK_HASH, TOK_HASHHASH, TOK_PLUS, TOK_MINUS, TOK_STAR, TOK_SLASH, TOK_PERCENT, TOK_INC, TOK_DEC, TOK_ASSIGN, TOK_PLUS_ASSIGN, TOK_MINUS_ASSIGN, TOK_MUL_ASSIGN, TOK_DIV_ASSIGN, TOK_MOD_ASSIGN, TOK_LSHIFT_ASSIGN, TOK_RSHIFT_ASSIGN, TOK_AND_ASSIGN, TOK_XOR_ASSIGN, TOK_OR_ASSIGN, TOK_EQ, TOK_NEQ, TOK_LT, TOK_LEQ, TOK_GT, TOK_GEQ, TOK_NOT, TOK_BITNOT, TOK_BITAND, TOK_BITOR, TOK_BITXOR, TOK_AND, TOK_OR, TOK_LSHIFT, TOK_RSHIFT, TOK_auto, TOK_break, TOK_case, TOK_char, TOK_const, TOK_continue, TOK_default, TOK_do, TOK_double, TOK_else, TOK_enum, TOK_extern, TOK_float, TOK_for, TOK_goto, TOK_if, TOK_inline, TOK_int, TOK_long, TOK_register, TOK_restrict, TOK_return, TOK_short, TOK_signed, TOK_sizeof, TOK_static, TOK_struct, TOK_switch, TOK_typedef, TOK_union, TOK_unsigned, TOK_void, TOK_volatile, TOK_while, } Token_Kind; char *token_to_op(Token_Kind kind) { switch (kind) { case TOK_LPAREN: return "("; case TOK_RPAREN: return ")"; case TOK_LBRACKET: return "["; case TOK_RBRACKET: return "]"; case TOK_LBRACE: return "{"; case TOK_RBRACE: return "}"; case TOK_COMMA: return ","; case TOK_DOT: return "."; case TOK_ARROW: return "->"; case TOK_ELLIPSIS: return "..."; case TOK_COLON: return ":"; case TOK_SEMICOLON: return ";"; case TOK_QUESTION: return "?"; case TOK_HASH: return "#"; case TOK_HASHHASH: return "##"; case TOK_PLUS: return "+"; case TOK_MINUS: return "-"; case TOK_STAR: return "*"; case TOK_SLASH: return "/"; case TOK_PERCENT: return "%"; case TOK_INC: return "++"; case TOK_DEC: return "--"; case TOK_ASSIGN: return "="; case TOK_PLUS_ASSIGN: return "+="; case TOK_MINUS_ASSIGN: return "-="; case TOK_MUL_ASSIGN: return "*="; case TOK_DIV_ASSIGN: return "/="; case TOK_MOD_ASSIGN: return "%="; case TOK_LSHIFT_ASSIGN: return "<<="; case TOK_RSHIFT_ASSIGN: return ">>="; case TOK_AND_ASSIGN: return "&="; case TOK_XOR_ASSIGN: return "^="; case TOK_OR_ASSIGN: return "|="; case TOK_EQ: return "=="; case TOK_NEQ: return "!="; case TOK_LT: return "<"; case TOK_LEQ: return "<="; case TOK_GT: return ">"; case TOK_GEQ: return ">="; case TOK_NOT: return "!"; case TOK_BITNOT: return "~"; case TOK_BITAND: return "&"; case TOK_BITOR: return "|"; case TOK_BITXOR: return "^"; case TOK_AND: return "&&"; case TOK_OR: return "||"; case TOK_LSHIFT: return "<<"; case TOK_RSHIFT: return ">>"; default: return 0; } } char *token_to_name(Token_Kind kind) { switch (kind) { case TOK_EOF: return "EOF"; case TOK_ERROR: return "ERROR"; case TOK_IDENT: return "IDENT"; case TOK_INT: return "INT"; case TOK_FLOAT: return "FLOAT"; case TOK_CHAR: return "CHAR"; case TOK_STRING: return "STRING"; case TOK_LPAREN: return "LPAREN"; case TOK_RPAREN: return "RPAREN"; case TOK_LBRACKET: return "LBRACKET"; case TOK_RBRACKET: return "RBRACKET"; case TOK_LBRACE: return "LBRACE"; case TOK_RBRACE: return "RBRACE"; case TOK_COMMA: return "COMMA"; case TOK_DOT: return "DOT"; case TOK_ARROW: return "ARROW"; case TOK_ELLIPSIS: return "ELLIPSIS"; case TOK_COLON: return "COLON"; case TOK_SEMICOLON: return "SEMICOLON"; case TOK_QUESTION: return "QUESTION"; case TOK_HASH: return "HASH"; case TOK_HASHHASH: return "HASHHASH"; case TOK_PLUS: return "PLUS"; case TOK_MINUS: return "MINUS"; case TOK_STAR: return "STAR"; case TOK_SLASH: return "SLASH"; case TOK_PERCENT: return "PERCENT"; case TOK_INC: return "INC"; case TOK_DEC: return "DEC"; case TOK_ASSIGN: return "ASSIGN"; case TOK_PLUS_ASSIGN: return "PLUS_ASSIGN"; case TOK_MINUS_ASSIGN: return "MINUS_ASSIGN"; case TOK_MUL_ASSIGN: return "MUL_ASSIGN"; case TOK_DIV_ASSIGN: return "DIV_ASSIGN"; case TOK_MOD_ASSIGN: return "MOD_ASSIGN"; case TOK_LSHIFT_ASSIGN: return "LSHIFT_ASSIGN"; case TOK_RSHIFT_ASSIGN: return "RSHIFT_ASSIGN"; case TOK_AND_ASSIGN: return "AND_ASSIGN"; case TOK_XOR_ASSIGN: return "XOR_ASSIGN"; case TOK_OR_ASSIGN: return "OR_ASSIGN"; case TOK_EQ: return "EQ"; case TOK_NEQ: return "NEQ"; case TOK_LT: return "LT"; case TOK_LEQ: return "LEQ"; case TOK_GT: return "GT"; case TOK_GEQ: return "GEQ"; case TOK_NOT: return "NOT"; case TOK_BITNOT: return "BITNOT"; case TOK_BITAND: return "BITAND"; case TOK_BITOR: return "BITOR"; case TOK_BITXOR: return "BITXOR"; case TOK_AND: return "AND"; case TOK_OR: return "OR"; case TOK_LSHIFT: return "LSHIFT"; case TOK_RSHIFT: return "RSHIFT"; case TOK_auto: return "auto"; case TOK_break: return "break"; case TOK_case: return "case"; case TOK_char: return "char"; case TOK_const: return "const"; case TOK_continue: return "continue"; case TOK_default: return "default"; case TOK_do: return "do"; case TOK_double: return "double"; case TOK_else: return "else"; case TOK_enum: return "enum"; case TOK_extern: return "extern"; case TOK_float: return "float"; case TOK_for: return "for"; case TOK_goto: return "goto"; case TOK_if: return "if"; case TOK_inline: return "inline"; case TOK_int: return "int"; case TOK_long: return "long"; case TOK_register: return "register"; case TOK_restrict: return "restrict"; case TOK_return: return "return"; case TOK_short: return "short"; case TOK_signed: return "signed"; case TOK_sizeof: return "sizeof"; case TOK_static: return "static"; case TOK_struct: return "struct"; case TOK_switch: return "switch"; case TOK_typedef: return "typedef"; case TOK_union: return "union"; case TOK_unsigned: return "unsigned"; case TOK_void: return "void"; case TOK_volatile: return "volatile"; case TOK_while: return "while"; default: return ""; } } // // KEYWORDS // char *keyword_auto; char *keyword_break; char *keyword_case; char *keyword_char; char *keyword_const; char *keyword_continue; char *keyword_default; char *keyword_do; char *keyword_double; char *keyword_else; char *keyword_enum; char *keyword_extern; char *keyword_float; char *keyword_for; char *keyword_goto; char *keyword_if; char *keyword_inline; char *keyword_int; char *keyword_long; char *keyword_register; char *keyword_restrict; char *keyword_return; char *keyword_short; char *keyword_signed; char *keyword_sizeof; char *keyword_static; char *keyword_struct; char *keyword_switch; char *keyword_typedef; char *keyword_union; char *keyword_unsigned; char *keyword_void; char *keyword_volatile; char *keyword_while; char *lex_first_keyword = NULL; char *lex_last_keyword = NULL; char *make_intern(char *string, int len); #define lex_add_keyword(x) make_intern(x, ilen(x) - 1) void lex_init_keywords(void) { keyword_auto = lex_add_keyword("auto"); keyword_break = lex_add_keyword("break"); keyword_case = lex_add_keyword("case"); keyword_char = lex_add_keyword("char"); keyword_const = lex_add_keyword("const"); keyword_continue = lex_add_keyword("continue"); keyword_default = lex_add_keyword("default"); keyword_do = lex_add_keyword("do"); keyword_double = lex_add_keyword("double"); keyword_else = lex_add_keyword("else"); keyword_enum = lex_add_keyword("enum"); keyword_extern = lex_add_keyword("extern"); keyword_float = lex_add_keyword("float"); keyword_for = lex_add_keyword("for"); keyword_goto = lex_add_keyword("goto"); keyword_if = lex_add_keyword("if"); keyword_inline = lex_add_keyword("inline"); keyword_int = lex_add_keyword("int"); keyword_long = lex_add_keyword("long"); keyword_register = lex_add_keyword("register"); keyword_restrict = lex_add_keyword("restrict"); keyword_return = lex_add_keyword("return"); keyword_short = lex_add_keyword("short"); keyword_signed = lex_add_keyword("signed"); keyword_sizeof = lex_add_keyword("sizeof"); keyword_static = lex_add_keyword("static"); keyword_struct = lex_add_keyword("struct"); keyword_switch = lex_add_keyword("switch"); keyword_typedef = lex_add_keyword("typedef"); keyword_union = lex_add_keyword("union"); keyword_unsigned = lex_add_keyword("unsigned"); keyword_void = lex_add_keyword("void"); keyword_volatile = lex_add_keyword("volatile"); keyword_while = lex_add_keyword("while"); #define TOK_FIRST_KEYWORD TOK_auto #define TOK_LAST_KEYWORD TOK_while lex_first_keyword = keyword_auto; lex_last_keyword = keyword_while; }