|
|
@ -3,7 +3,7 @@ |
|
|
|
# Copyright (c) 2016-2021 Ian Piumarta and other contributors (see AUTHORS) |
|
|
|
# All rights reserved (see LICENSE) |
|
|
|
# |
|
|
|
# Last edited: 2023-03-22 17:53:24 by piumarta on zora-10.local |
|
|
|
# Last edited: 2023-03-22 18:09:27 by piumarta on zora-10.local |
|
|
|
|
|
|
|
%{ |
|
|
|
/* compile: leg -o ccmeta.c ccmeta.leg |
|
|
@ -116,10 +116,10 @@ oop struct_last = 0; |
|
|
|
DO_PROTOS() _DO(__proto__) _DO(__name__) _DO(__default__) _DO(__arguments__) \ |
|
|
|
_DO(name) _DO(body) _DO(param) _DO(key) _DO(value) _DO(condition) _DO(consequent) _DO(alternate) \ |
|
|
|
_DO(lhs) _DO(rhs) _DO(scope) _DO(args) _DO(expression) _DO(labels) _DO(statements) _DO(initialise) \ |
|
|
|
_DO(update) _DO(this) _DO(fixed) _DO(operator) _DO(map) _DO(func) \ |
|
|
|
_DO(update) _DO(this) _DO(fixed) _DO(operator) _DO(map) _DO(func) _DO(keys) \ |
|
|
|
_DO(try) _DO(catch) _DO(finally) _DO(exception) \ |
|
|
|
_DO(__line__) _DO(__file__) \ |
|
|
|
_DO(comment) \ |
|
|
|
_DO(comment) \ |
|
|
|
_DO(text) _DO(ifTok) _DO(lparen) _DO(rparen) _DO(elseTok) _DO(identifier) _DO(semicolon) \ |
|
|
|
_DO(whileTok) \ |
|
|
|
_DO(doTok) _DO(forTok) _DO(initExpr) _DO(condExpr) _DO(incrExpr) _DO(firstSemi) _DO(secondSemi) \ |
|
|
@ -1269,11 +1269,12 @@ oop getSyntax(int n, oop func) |
|
|
|
return getSyntaxId(n, key); |
|
|
|
} |
|
|
|
|
|
|
|
oop newCall(oop func, oop args) |
|
|
|
oop newCall(oop func, oop args, oop keys) |
|
|
|
{ |
|
|
|
oop call = newObject(Call_proto); |
|
|
|
map_set(call, func_symbol, func); |
|
|
|
map_set(call, args_symbol, args); |
|
|
|
map_set(call, keys_symbol, keys); |
|
|
|
return call; |
|
|
|
} |
|
|
|
|
|
|
@ -2468,7 +2469,7 @@ meta_prefix = META_PLUS n:meta_prefix { $$= n } |
|
|
|
meta_postfix = i:meta_value ( META_DOT s:META_IDENT a:meta_argumentList { i = newInvoke(i, s, a) } |
|
|
|
| META_DOT s:META_IDENT !meta_assignOp { i = newGetMap(GetMember_proto, i, s) } |
|
|
|
| META_LBRAC p:meta_exp META_RBRAC !meta_assignOp { i = newGetMap(GetIndex_proto, i, p) } |
|
|
|
| a:meta_argumentList { i = (null != getSyntax(1, i)) ? apply(globals, globals, getSyntax(1, i), a, i) : newCall(i, a) } |
|
|
|
| a:meta_argumentList { oop k = map_pop(a); i = newCall(i, a, k) } |
|
|
|
| META_PLUSPLUS { i = newPostIncrement(i) } |
|
|
|
| META_MINUSMINUS { i = newPostDecrement(i) } |
|
|
|
) * { $$ = i } |
|
|
@ -2480,12 +2481,12 @@ meta_paramList = META_LPAREN m:meta_makeMap |
|
|
|
) ? |
|
|
|
META_RPAREN { $$ = m } |
|
|
|
|
|
|
|
meta_argumentList = META_LPAREN m:meta_makeMap |
|
|
|
( e:meta_exp { map_append(m, e) } |
|
|
|
( META_COMMA e:meta_exp { map_append(m, e) } |
|
|
|
) * |
|
|
|
) ? |
|
|
|
META_RPAREN { $$ = m } |
|
|
|
meta_argumentList = META_LPAREN m:meta_makeMap n:meta_makeMap |
|
|
|
( (i:META_IDENT META_COLON { map_set(n, makeInteger(map_size(m)), i) })? e:meta_exp { map_append(m, e) } |
|
|
|
( META_COMMA (i:META_IDENT META_COLON { map_set(n, makeInteger(map_size(m)), i) })? e:meta_exp { map_append(m, e) } |
|
|
|
) * |
|
|
|
) ? |
|
|
|
META_RPAREN { map_append(m, n); $$ = m } |
|
|
|
|
|
|
|
meta_value = n:META_FLOAT { $$ = newFloat(n) } |
|
|
|
| n:meta_integer { $$ = newInteger(n) } |
|
|
@ -3214,7 +3215,29 @@ oop eval(oop scope, oop ast) |
|
|
|
printBacktrace(ast); |
|
|
|
exit(1); |
|
|
|
} |
|
|
|
oop keys = map_get(ast, keys_symbol); |
|
|
|
oop args = map_get(ast, args_symbol); |
|
|
|
if (keys != null && map_size(keys) > 0) { |
|
|
|
oop newArgs = makeMap(); |
|
|
|
for (int i = 0; i<map_size(args); i++) { |
|
|
|
if (map_get(keys, makeInteger(i)) == null) { |
|
|
|
map_append(newArgs, map_get(args, makeInteger(i))); |
|
|
|
} else { |
|
|
|
map_append(newArgs, null); |
|
|
|
} |
|
|
|
} |
|
|
|
oop paramFunc = get(func, Function, param); |
|
|
|
oop idKeys = map_keys(keys); |
|
|
|
for (int k = 0; k<map_size(paramFunc); k++) { |
|
|
|
oop oopK = makeInteger(k); |
|
|
|
for (int i = 0; i<map_size(keys); i++) { |
|
|
|
oop oopI = makeInteger(i); |
|
|
|
if (map_get(keys, map_get(idKeys, oopI)) == map_get(paramFunc, oopK)) |
|
|
|
map_set(newArgs, oopK, map_get(args, map_get(idKeys, oopI))); |
|
|
|
} |
|
|
|
} |
|
|
|
args = newArgs; |
|
|
|
} |
|
|
|
if (isFalse(get(func, Function, fixed))) { |
|
|
|
args = evalArgs(scope, args); |
|
|
|
} |
|
|
|