Ver a proveniência

Remove Symbol's value and defined and store them in Map KV

master
mtardy há 4 anos
ascendente
cometimento
73fc6a9e08
2 ficheiros alterados com 35 adições e 26 eliminações
  1. +5
    -18
      calc.leg
  2. +30
    -8
      object.c

+ 5
- 18
calc.leg Ver ficheiro

@ -6,27 +6,13 @@
* run: ( echo a=2*3; echo b=3+4; echo c=a*b ) | ./calc
*/
#define SYMBOL_PAYLOAD \
oop value; \
int defined
#define SYMBOL_INITIALISE(S) \
S.value = null; \
S.defined = false
#include "object.c"
// this is the global scope
oop globals;
// oop globals;
// this should stay out of object.c because it manipulates Symbol members defined in this file
oop update_symbol_value(oop symbol, oop integer)
{
set(symbol, Symbol, value, integer);
return symbol;
}
oop apply(oop function, oop parameters)
{
return get(function, Function, primitive)(parameters);
@ -40,7 +26,7 @@ YYSTYPE yylval;
start = - e:exp { yylval = e }
exp = l:IDENT EQUAL p:exp { $$ = update_symbol_value(l, p) }
exp = l:IDENT EQUAL p:exp { $$ = variableSet(l, p) }
| l:postfix DOT i:IDENT EQUAL p:exp { $$ = map_set(l, i, p) }
| l:postfix LBRAC i:exp RBRAC EQUAL p:exp { $$ = map_set(l, i, p) }
| s:sum { $$ = s }
@ -78,7 +64,7 @@ value = n:NUMBER { $$ = n }
| s:symbol { $$ = s }
| m:map { $$ = m }
| NULL { $$ = null }
| i:IDENT { $$ = get(i, Symbol, value) }
| i:IDENT { $$ = variableGet(i) }
| LPAREN i:exp RPAREN { $$ = i }
string = SQUOTE < (!SQUOTE .)* > SQUOTE { $$ = makeString(yytext) }
@ -136,7 +122,8 @@ int main(int argc, char **argv)
{
globals = makeMap();
set(intern(globals, "exit"), Symbol, value, makeFunction(prim_exit)); // map_set(globals, intern("exit"), makeFunction(prim_exit));
variableSet(intern(globals, "exit"), makeFunction(prim_exit));
// map_set(globals, intern("exit"), makeFunction(prim_exit));
while (yyparse()) {
println(yylval);

+ 30
- 8
object.c Ver ficheiro

@ -37,13 +37,12 @@ struct String {
struct Symbol {
type_t type;
char *name;
#if defined(SYMBOL_PAYLOAD)
SYMBOL_PAYLOAD;
#endif // defined(SYMBOL_PAYLOAD)
};
typedef oop (*primitive_t)(oop params);
oop globals;
struct Function {
type_t type;
primitive_t primitive;
@ -131,9 +130,6 @@ oop makeSymbol(char *name)
oop newSymb = memcheck(malloc(sizeof(union object)));
newSymb->type = Symbol;
newSymb->Symbol.name = name;
#if defined(SYMBOL_INITIALISE)
SYMBOL_INITIALISE(newSymb->Symbol);
#endif // defined(SYMBOL_INITIALISE)
return newSymb;
}
@ -185,6 +181,13 @@ ssize_t map_search(oop map, oop key)
return -1 - l; // negative result => 'not found', reflected around -1 instead of 0 to allow 'not found' at index 0
}
bool map_hasKey(oop map, oop key)
{
assert(is(Map, map));
assert(key);
return map_search >= 0;
}
oop map_get(oop map, oop key)
{
assert(is(Map, map));
@ -257,6 +260,26 @@ oop map_append(oop map, oop value)
return map_set(map, makeInteger(get(map, Map, size)), value);
}
bool variableIsDefined(oop aSymbol)
{
assert(is(Symbol, aSymbol));
return map_hasKey(globals, aSymbol);
}
oop variableSet(oop aSymbol, oop value)
{
assert(is(Symbol, aSymbol));
assert(value);
map_set(globals, aSymbol, value);
return value;
}
oop variableGet(oop aSymbol)
{
assert(is(Symbol, aSymbol));
return map_get(globals, aSymbol);
}
void print(oop ast)
{
assert(ast);
@ -271,8 +294,7 @@ void print(oop ast)
printf("'%s'", get(ast, String, value));
return;
case Symbol:
printf("%s=", get(ast, Symbol, name));
print(get(ast, Symbol, value));
printf("%s", get(ast, Symbol, name));
return;
case Function:
printf("Function@%p", get(ast, Function, primitive));

Carregando…
Cancelar
Guardar