321 lines
9.6 KiB
C
321 lines
9.6 KiB
C
// 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 "<invalid-token-kind>";
|
|
}
|
|
}
|
|
//
|
|
// 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;
|
|
}
|