Files
smallprojects/meta.c
2026-05-23 11:06:54 +02:00

108 lines
3.2 KiB
C

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "base.c"
int main() {
typedef struct {
char *name;
char *serialized_operator;
} Task;
Task kinds[] = {
{"EOF", 0},
{"ERROR", 0},
{"IDENT", 0},
{"KEYWORD", 0},
{"INT", 0},
{"FLOAT", 0},
{"CHAR", 0},
{"STRING", 0},
{"LPAREN", "("},
{"RPAREN", ")"},
{"LBRACKET", "["},
{"RBRACKET", "]"},
{"LBRACE", "{"},
{"RBRACE", "}"},
{"COMMA", ","},
{"DOT", "."},
{"ARROW", "->"},
{"ELLIPSIS", "..."},
{"COLON", ":"},
{"SEMICOLON", ";"},
{"QUESTION", "?"},
{"HASH", "#"},
{"HASHHASH", "##"},
{"PLUS", "+"},
{"MINUS", "-"},
{"STAR", "*"},
{"SLASH", "/"},
{"PERCENT", "%"},
{"INC", "++"},
{"DEC", "--"},
{"ASSIGN", "="},
{"PLUS_ASSIGN", "+="},
{"MINUS_ASSIGN", "-="},
{"MUL_ASSIGN", "*="},
{"DIV_ASSIGN", "/="},
{"MOD_ASSIGN", "%="},
{"LSHIFT_ASSIGN", "<<="},
{"RSHIFT_ASSIGN", ">>="},
{"AND_ASSIGN", "&="},
{"XOR_ASSIGN", "^="},
{"OR_ASSIGN", "|="},
{"EQ", "=="},
{"NEQ", "!="},
{"LT", "<"},
{"LEQ", "<="},
{"GT", ">"},
{"GEQ", ">="},
{"NOT", "!"},
{"BITNOT", "~"},
{"BITAND", "&"},
{"BITOR", "|"},
{"BITXOR", "^"},
{"AND", "&&"},
{"OR", "||"},
{"LSHIFT", "<<"},
{"RSHIFT", ">>"},
};
printf("// auto generated by meta.c\n");
printf("typedef enum {\n");
for (int i = 0; i < ilen(kinds); i += 1) {
printf(" TOK_%s,\n", kinds[i].name);
}
printf("} Token_Kind;\n");
printf("char *token_to_op(Token_Kind kind) {\n");
printf(" switch (kind) {\n");
for (int i = 0; i < ilen(kinds); i += 1) {
if (kinds[i].serialized_operator) {
printf(" case TOK_%s: return \"%s\";\n", kinds[i].name, kinds[i].serialized_operator);
}
}
printf(" default: return 0;\n");
printf(" }\n");
printf("}\n");
printf("char *token_to_name(Token_Kind kind) {\n");
printf(" switch (kind) {\n");
for (int i = 0; i < ilen(kinds); i += 1) {
if (kinds[i].name) {
printf(" case TOK_%s: return \"%s\";\n", kinds[i].name, kinds[i].name);
}
}
printf(" default: return \"<invalid-token-kind>\";\n");
printf(" }\n");
printf("}\n");
}