From b477ac27210399b976e70195e92fb13315d39769 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Fri, 19 Aug 2016 22:49:23 +0200 Subject: Start interpreter --- interpreter.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ interpreter.h | 10 ++++++++ 2 files changed, 92 insertions(+) create mode 100644 interpreter.c create mode 100644 interpreter.h diff --git a/interpreter.c b/interpreter.c new file mode 100644 index 0000000..5a3d66a --- /dev/null +++ b/interpreter.c @@ -0,0 +1,82 @@ +#include +#include +#include +#include + +#include "interpreter.h" +#include "util.h" + + +int namehash(const char *name,int mod){ + int h=0; + for(int i=0;name[i];i++)h+=name[i]; + return h%mod; +} + + +#define VMAP_HASHSZ (61) + +typedef struct Vllist{ + char *name; + AST *value; + struct Vllist *next; +} Vllist; + +typedef struct Scope{ + Vllist *vmap[VMAP_HASHSZ]; + struct Scope *next; +} Scope; + + +typedef struct Symbolstore{ + int sz,len; + char **syms; +} Symbolstore; + + +struct InterState{ + Scope *scope; + Symbolstore ss; +}; + + +Scope* scope_make(void){ + Scope *scope=malloc(1,Scope); + memset(scope->vmap,0,VMAP_HASHSZ*sizeof(Vllist*)); + scope->next=NULL; + return scope; +} + + +InterState* inter_make(void){ + InterState *is=malloc(1,InterState); + is->scope=scope_make(); + is->ss.sz=16; + is->ss.len=0; + is->ss.syms=malloc(is->ss.sz,char*); + return is; +} + +static void scope_destroy(Scope *scope,bool recursive){ + do { + for(int i=0;ivmap[i]){ + Vllist *ll=scope->vmap[i]; + free(ll->name); + ast_free(ll->value); + scope->vmap[i]=ll->next; + free(ll); + } + } + Scope *next=scope->next; + free(scope); + scope=next; + } while(recursive&&scope); +} + +void inter_destroy(InterState *is){ + assert(is); + scope_destroy(is->scope,true); + for(int i=0;iss.len;i++)free(is->ss.syms[i]); + free(is->ss.syms); +} diff --git a/interpreter.h b/interpreter.h new file mode 100644 index 0000000..66edce0 --- /dev/null +++ b/interpreter.h @@ -0,0 +1,10 @@ +#pragma once + +#include "ast.h" + + +typedef struct InterState InterState; + +InterState* inter_make(void); +void inter_destroy(InterState *is); +void inter_runcode(AST *ast); //updates symbol id's -- cgit v1.2.3-54-g00ecf