소스 검색

Add map '[exp]' access and assignement

master
mtardy 4 년 전
부모
커밋
b80f2da496
1개의 변경된 파일32개의 추가작업 그리고 3개의 파일을 삭제
  1. +32
    -3
      parse.leg

+ 32
- 3
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(getMember) _DO(setMember)
#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) _DO(getIndex) _DO(setIndex)
typedef enum {
t_UNDEFINED=0,
@ -114,6 +114,7 @@ oop newBinary(oop proto, oop lhs, oop rhs)
return obj;
}
// factorize a bit or not?
oop newSetMember(oop map, oop key, oop value)
{
oop obj = newObject(setMember_proto);
@ -131,6 +132,23 @@ oop newGetMember(oop map, oop key)
return obj;
}
oop newSetIndex(oop map, oop key, oop value)
{
oop obj = newObject(setIndex_proto);
map_set(obj, map_symbol, map);
map_set(obj, key_symbol, key);
map_set(obj, value_symbol, value);
return obj;
}
oop newGetIndex(oop map, oop key)
{
oop obj = newObject(getIndex_proto);
map_set(obj, map_symbol, map);
map_set(obj, key_symbol, key);
return obj;
}
// this always creates the key in "object"
oop newVariable(oop object, oop key, oop value)
{
@ -175,7 +193,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 { $$ = newSetMember(l, i, p) }
| l:postfix LBRAC i:exp RBRAC EQUAL p:exp { $$ = map_set(l, i, p) }
| l:postfix LBRAC i:exp RBRAC EQUAL p:exp { $$ = newSetIndex(l, i, p) }
| s:sum { $$ = s }
sum = l:prod
@ -195,7 +213,7 @@ prefix = MINUS n:prefix { set(n, Integer, value, -get(n, Integer
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 = newGetMember(i, s) }
| LBRAC p:exp RBRAC !EQUAL { i = map_get(i, p) }
| LBRAC p:exp RBRAC !EQUAL { i = newGetIndex(i, p) }
| p:parameterList { i = apply(i, p) }
) * { $$ = i }
@ -303,6 +321,17 @@ oop eval(oop scope, oop ast)
oop value = eval(scope, map_get(ast, value_symbol));
return map_set(map, key, value);
}
case t_getIndex: {
oop map = eval(scope, map_get(ast, map_symbol));
oop key = eval(scope, map_get(ast, key_symbol));
return map_get(map, key);
}
case t_setIndex: {
oop map = eval(scope, map_get(ast, map_symbol));
oop key = eval(scope, 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: {

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