WIP top-level parsing and keyword tokens
This commit is contained in:
151
meta_gen.c
151
meta_gen.c
@@ -3,7 +3,6 @@ typedef enum {
|
||||
TOK_EOF,
|
||||
TOK_ERROR,
|
||||
TOK_IDENT,
|
||||
TOK_KEYWORD,
|
||||
TOK_INT,
|
||||
TOK_FLOAT,
|
||||
TOK_CHAR,
|
||||
@@ -56,6 +55,40 @@ typedef enum {
|
||||
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) {
|
||||
@@ -115,7 +148,6 @@ char *token_to_name(Token_Kind kind) {
|
||||
case TOK_EOF: return "EOF";
|
||||
case TOK_ERROR: return "ERROR";
|
||||
case TOK_IDENT: return "IDENT";
|
||||
case TOK_KEYWORD: return "KEYWORD";
|
||||
case TOK_INT: return "INT";
|
||||
case TOK_FLOAT: return "FLOAT";
|
||||
case TOK_CHAR: return "CHAR";
|
||||
@@ -168,6 +200,121 @@ char *token_to_name(Token_Kind kind) {
|
||||
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user