WIP top-level parsing and keyword tokens

This commit is contained in:
Krzosa Karol
2026-05-23 15:39:04 +02:00
parent fc04ee5c3e
commit b1b79abfd4
7 changed files with 431 additions and 155 deletions

View File

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