From 44602cb35735575c15cfcb92779337778649df8a Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Sat, 20 Aug 2016 13:34:26 +0200 Subject: Intern symbols --- interpreter.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'interpreter.c') diff --git a/interpreter.c b/interpreter.c index 5a3d66a..333b8c9 100644 --- a/interpreter.c +++ b/interpreter.c @@ -80,3 +80,41 @@ void inter_destroy(InterState *is){ for(int i=0;iss.len;i++)free(is->ss.syms[i]); free(is->ss.syms); } + + +static void intern_symbols(InterState *is,AST *ast){ + switch(ast->type){ + case AST_LIST: + for(int i=0;il.len;i++)intern_symbols(is,ast->l.nodes[i]); + break; + + case AST_SYMBOL:{ + if(ast->s.symid>=0&&ast->s.symidss.len&&strcmp(ast->s.name,is->ss.syms[ast->s.symid])==0){ + break; + } + int i; + for(i=0;iss.len;i++){ + if(strcmp(is->ss.syms[i],ast->s.name)==0)break; + } + if(iss.len){ + ast->s.symid=i; + break; + } + if(is->ss.len==is->ss.sz){ + is->ss.sz*=2; + is->ss.syms=realloc(is->ss.syms,is->ss.sz,char*); + } + is->ss.syms[is->ss.len++]=copystring(ast->s.name); + break; + } + + case AST_WORD: + case AST_NUMBER: + case AST_STRING: + break; + } +} + +void inter_runcode(InterState *is,AST *ast){ + intern_symbols(is,ast); +} -- cgit v1.2.3-54-g00ecf