Files
smallprojects/meta_gen.c
2026-05-23 15:39:04 +02:00

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;
}