diff options
| author | Paul Buetow <paul@buetow.org> | 2008-10-19 00:12:57 +0000 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2008-10-19 00:12:57 +0000 |
| commit | 982e35bd0bd9bc9b55c0f898556c3e1831141258 (patch) | |
| tree | 95d12d94983ac396c693f96825cc3beea8cad50c /src/core | |
| parent | 41e590f05d295a40ba4633d493be1ffe28f16ddf (diff) | |
synonyms work
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/interpret.c | 21 | ||||
| -rw-r--r-- | src/core/symbol.c | 3 | ||||
| -rw-r--r-- | src/core/symbol.h | 2 |
3 files changed, 24 insertions, 2 deletions
diff --git a/src/core/interpret.c b/src/core/interpret.c index a69e85a..2c80163 100644 --- a/src/core/interpret.c +++ b/src/core/interpret.c @@ -222,6 +222,22 @@ _var_assign(Interpret *p_interpret) { if (p_interpret->tt == TT_ASSIGN) { _NEXT + if (p_interpret->tt == TT_VID) { + _NEXT + if (p_interpret->tt != TT_IDENT) + _INTERPRET_ERROR("Expected identifier", p_interpret->p_token); + + char *c_name_ = token_get_val(p_interpret->p_token); + Symbol *p_symbol = scope_get(p_interpret->p_scope, c_name_); + + if (p_symbol == NULL) + _INTERPRET_ERROR("No such symbol", p_interpret->p_token); + + symbol_ref_up(p_symbol); + scope_newset(p_interpret->p_scope, c_name, p_symbol); + _NEXT + + } else { Stack *p_stack = p_interpret->p_stack; p_interpret->p_stack = stack_new(); @@ -236,11 +252,10 @@ _var_assign(Interpret *p_interpret) { p_token = stack_top(p_interpret->p_stack); Symbol *p_symbol = symbol_new(SYM_VARIABLE, p_token); scope_newset(p_interpret->p_scope, c_name, p_symbol); - } else { return (0); } - + } } else { Token *p_token = token_new_integer(0); Symbol *p_symbol = symbol_new(SYM_VARIABLE, p_token); @@ -912,6 +927,7 @@ _term(Interpret *p_interpret) { } break; + /* case TT_PARANT_AL: { Token *p_token = p_interpret->p_token; @@ -922,6 +938,7 @@ _term(Interpret *p_interpret) { _INTERPRET_ERROR("arrays not yet fully implemented", p_token_arr); } break; + */ case TT_PARANT_L: { diff --git a/src/core/symbol.c b/src/core/symbol.c index 2343cdb..37a0cae 100644 --- a/src/core/symbol.c +++ b/src/core/symbol.c @@ -42,12 +42,14 @@ symbol_new(SymbolType sym, void *p_val) { p_symbol->sym = sym; p_symbol->p_val = p_val; + p_symbol->i_refs = 1; return p_symbol; } void symbol_delete(Symbol *p_symbol) { + if (--p_symbol->i_refs == 0) { switch (symbol_get_sym(p_symbol)) { case SYM_PROCEDURE: { @@ -58,6 +60,7 @@ symbol_delete(Symbol *p_symbol) { NO_DEFAULT; } free(p_symbol); + } } void diff --git a/src/core/symbol.h b/src/core/symbol.h index 2bd248c..a077bd6 100644 --- a/src/core/symbol.h +++ b/src/core/symbol.h @@ -41,6 +41,7 @@ #define symbol_set_sym(s,st) s->sym = st #define symbol_get_val(s) s->p_val #define symbol_get_sym(s) s->sym +#define symbol_ref_up(s) ++s->i_refs #define IS_A_FUNCTION(s) (s == SYM_INLINEFUNCTION || s == SYM_FUNCTION) #define IS_NOT_A_FUNCTION(s) !IS_A_FUNCTION(s) @@ -55,6 +56,7 @@ typedef enum { typedef struct { SymbolType sym; void *p_val; + unsigned i_refs; } Symbol; Symbol* symbol_new(SymbolType sym, void *p_val); |
