sym_addtype(&(p->syms), "i16", IntType(16u));
sym_addtype(&(p->syms), "i32", IntType(32u));
sym_addtype(&(p->syms), "i64", IntType(64u));
- sym_addtype(&(p->syms), "string", ArrayOf(sym_get(&(p->syms), "byte"), -1));
+ sym_addtype(&(p->syms), "string",
+ ArrayOf(sym_get(&(p->syms), "byte")->type, -1));
}
/* Driver Modes
static int emit_ast(void) {
AST* tree = NULL;
Parser ctx = { .input = stdin };
+ builtins(&ctx);
while(NULL != (tree = toplevel(&ctx)))
pprint_tree(stdout, tree, 0);
return 0;
void sym_adddef(SymTable* syms, char* name, Type* type);
void sym_addtype(SymTable* syms, char* name, Type* type);
-Type* sym_get(SymTable* syms, char* name);
+Sym* sym_get(SymTable* syms, char* name);
/* AST Types
*****************************************************************************/
#include <sclpl.h>
-void sym_adddef(SymTable* syms, char* name, Type* type) {
+Sym* mksym(char* name, Type* type, bool is_typedef, Sym* next) {
+ Sym* sym = emalloc(sizeof(Sym));
+ sym->name = name;
+ sym->type = type;
+ sym->is_typedef = is_typedef;
+ sym->next = next;
+ return sym;
+}
+void sym_adddef(SymTable* syms, char* name, Type* type) {
+ syms->syms = mksym(name, type, false, syms->syms);
}
void sym_addtype(SymTable* syms, char* name, Type* type) {
-
+ syms->syms = mksym(name, type, true, syms->syms);
}
-Type* sym_get(SymTable* syms, char* name) {
+Sym* sym_get(SymTable* syms, char* name) {
+ Sym* sym = syms->syms;
+ for (; sym; sym = sym->next)
+ if (!strcmp(sym->name, name))
+ return sym;
return NULL;
}