소스 검색

Add map 'dot' access and assignement

pull/5/head
mtardy 4 년 전
부모
커밋
cd50470f38
1개의 변경된 파일33개의 추가작업 그리고 11개의 파일을 삭제
  1. +33
    -11
      parse.leg

+ 33
- 11
parse.leg 파일 보기

@ -6,7 +6,7 @@
* run: echo "3+4" | ./parse
*/
#define DO_PROTOS() _DO(map) _DO(declar) _DO(assign) _DO(symbol) _DO(integer) _DO(string) _DO(add) _DO(sub) _DO(mul) _DO(div) _DO(mod) _DO(member)
#define DO_PROTOS() _DO(map) _DO(declar) _DO(assign) _DO(symbol) _DO(integer) _DO(string) _DO(add) _DO(sub) _DO(mul) _DO(div) _DO(mod) _DO(getMember) _DO(setMember)
typedef enum {
t_UNDEFINED=0,
@ -27,7 +27,7 @@ oop apply(oop function, oop parameters)
return get(function, Function, primitive)(parameters);
}
#define DO_SYMBOLS() DO_PROTOS() _DO(__proto__) _DO(__name__) _DO(value) _DO(lhs) _DO(rhs) _DO(scope)
#define DO_SYMBOLS() DO_PROTOS() _DO(__proto__) _DO(__name__) _DO(key) _DO(value) _DO(lhs) _DO(rhs) _DO(scope)
#define _DO(NAME) oop NAME##_symbol;
DO_SYMBOLS()
@ -114,10 +114,21 @@ oop newBinary(oop proto, oop lhs, oop rhs)
return obj;
}
oop newMember(oop map, oop key)
oop newSetMember(oop map, oop key, oop value)
{
oop obj = newObject(member_proto);
// map_set(obj, )
oop obj = newObject(setMember_proto);
map_set(obj, map_symbol, map);
map_set(obj, key_symbol, key);
map_set(obj, value_symbol, value);
return obj;
}
oop newGetMember(oop map, oop key)
{
oop obj = newObject(getMember_proto);
map_set(obj, map_symbol, map);
map_set(obj, key_symbol, key);
return obj;
}
// this always creates the key in "object"
@ -163,7 +174,7 @@ start = - e:exp { yylval = e }
exp = VAR l:IDENT { $$ = newDeclar(l) }
| l:IDENT EQUAL p:exp { $$ = newAssign(l, p) }
| l:postfix DOT i:IDENT EQUAL p:exp { $$ = map_set(l, i, p) }
| l:postfix DOT i:IDENT EQUAL p:exp { $$ = newSetMember(l, i, p) }
| l:postfix LBRAC i:exp RBRAC EQUAL p:exp { $$ = map_set(l, i, p) }
| s:sum { $$ = s }
@ -183,7 +194,7 @@ prefix = MINUS n:prefix { set(n, Integer, value, -get(n, Integer
| n:postfix { $$ = n }
postfix = i:value ( DOT s:IDENT p:parameterList { map_set(p, intern("this"), i); i = apply(map_get(i, s), p) }
| DOT s:IDENT !EQUAL { i = map_get(i, s) }
| DOT s:IDENT !EQUAL { i = newGetMember(i, s) }
| LBRAC p:exp RBRAC !EQUAL { i = map_get(i, p) }
| p:parameterList { i = apply(i, p) }
) * { $$ = i }
@ -281,9 +292,20 @@ oop eval(oop scope, oop ast)
oop rhs = eval(scope, map_get(ast, rhs_symbol));
return setVariable(scope, lhs, rhs);
}
case t_symbol:
case t_integer:
case t_string: {
case t_getMember: {
oop map = eval(scope, map_get(ast, map_symbol));
oop key = map_get(ast, key_symbol);
return map_get(map, key);
}
case t_setMember: {
oop map = eval(scope, map_get(ast, map_symbol));
oop key = map_get(ast, key_symbol);
oop value = eval(scope, map_get(ast, value_symbol));
return map_set(map, key, value);
}
case t_symbol:
case t_integer:
case t_string: {
return map_get(ast, value_symbol);
}
case t_add: {
@ -358,7 +380,7 @@ int main(int argc, char **argv)
println(myThird);
println(getVariable(mySecond, myPizzaSymbol));
*/
while (yyparse()) {
println(yylval);

불러오는 중...
취소
저장