summaryrefslogtreecommitdiff
path: root/interpreter.c
diff options
context:
space:
mode:
Diffstat (limited to 'interpreter.c')
-rw-r--r--interpreter.c38
1 files changed, 38 insertions, 0 deletions
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;i<is->ss.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;i<ast->l.len;i++)intern_symbols(is,ast->l.nodes[i]);
+ break;
+
+ case AST_SYMBOL:{
+ if(ast->s.symid>=0&&ast->s.symid<is->ss.len&&strcmp(ast->s.name,is->ss.syms[ast->s.symid])==0){
+ break;
+ }
+ int i;
+ for(i=0;i<is->ss.len;i++){
+ if(strcmp(is->ss.syms[i],ast->s.name)==0)break;
+ }
+ if(i<is->ss.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);
+}