]> git.mdlowis.com Git - proto/sclpl.git/commitdiff
added symbol table implementation and registered builtins
authorMichael D. Lowis <mike@mdlowis.com>
Fri, 1 Jun 2018 01:31:25 +0000 (21:31 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Fri, 1 Jun 2018 01:31:25 +0000 (21:31 -0400)
source/main.c
source/sclpl.h
source/syms.c

index 8f9ed76d2e13291a0bcb3de18da45051c2211eec..adc3d7aa27b3a11d5e1353a4a95aeb045a66968b 100644 (file)
@@ -19,7 +19,8 @@ static void builtins(Parser* p) {
     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
@@ -40,6 +41,7 @@ static int emit_tokens(void) {
 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;
index 8bb748c991e32d62962b5dd31fa52e72042a65d6..69df9843a1ddd0cacfe806750332582e0aab90ed 100644 (file)
@@ -100,7 +100,7 @@ typedef struct {
 
 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
  *****************************************************************************/
index f356b0ac5e63f5f1d12015afc190a1fa6521b415..0ba2934e3090c9d44f1d70850260abdbb37d037f 100644 (file)
@@ -1,13 +1,26 @@
 #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;
 }