summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2008-10-19 00:12:57 +0000
committerPaul Buetow <paul@buetow.org>2008-10-19 00:12:57 +0000
commit982e35bd0bd9bc9b55c0f898556c3e1831141258 (patch)
tree95d12d94983ac396c693f96825cc3beea8cad50c /src/core
parent41e590f05d295a40ba4633d493be1ffe28f16ddf (diff)
synonyms work
Diffstat (limited to 'src/core')
-rw-r--r--src/core/interpret.c21
-rw-r--r--src/core/symbol.c3
-rw-r--r--src/core/symbol.h2
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);