--- esr.py- 2016-09-23 00:00:00.000000000 +0900 +++ esr.py 2016-09-24 00:00:00.000000000 +0900 @@ -103,20 +103,20 @@ def name_bra(lst): tbl = [ [ [ [ 'type' ], [ 'name' ], [ 'br_s', '(' ], [ 'br_s', '{' ] ], lambda type, name, (k, v, args), (k2, v2, body): - [ 'fdef', name[1], [ k, v, name_bra(args) ], type, [ k2, v2, name_bra(body) ] ] ], + [ [ 'fdef', name[1], [ k, v, name_bra(args) ], type, [ k2, v2, name_bra(body) ] ] ] ], [ [ [ 'type' ], [ 'name' ], [ 'br_s', '(' ] ], - lambda type, name, (k, v, args): [ 'fproto', name[1], [ k, v, name_bra(args) ], type ] ], + lambda type, name, (k, v, args): [ [ 'fproto', name[1], [ k, v, name_bra(args) ], type ] ] ], [ [ [ 'name' ], [ 'br_s', '(' ] ], - lambda name, (k, v, args): [ 'fcall', name[1], [ k, v, name_bra(args) ] ] ], + lambda name, (k, v, args): [ [ 'fcall', name[1], [ k, v, name_bra(args) ] ] ] ], [ [ [ 'name' ], [ 'br_s', '[' ] ], - lambda name, (k, v, idx): [ 'arr', name[1], [ k, v, name_bra(idx) ] ] ], + lambda name, (k, v, idx): [ name, [ 'op', '[' ], [ k, '(', name_bra(idx) ] ] ], [ [ [ 'br_s' ] ], - lambda (k, v, slst): [ k, v, name_bra(slst) ] ] + lambda (k, v, slst): [ [ k, v, name_bra(slst) ] ] ] ] for (pat, f) in tbl: if is_match(lst, pat): pn = len(pat) - return [ f( *lst[:pn] ) ] + name_bra(lst[pn:]) + return f( *lst[:pn] ) + name_bra( lst[pn:] ) return [ lst[0] ] + name_bra(lst[1:]) tstk = [] @@ -177,7 +177,7 @@ def tree_op(lst, ops): if k == 'br_s': e = [ k, v, tree_op( e[2], ops ) ] - elif k in [ 'fcall', 'arr' ]: + elif k == 'fcall': e = [ k, v, tree_op( [ e[2] ], ops )[0] ] elif k == 'fdef': e = [ k, v, e[2], e[3], tree_op( [ e[4] ], ops )[0] ] @@ -185,7 +185,7 @@ def tree_op(lst, ops): if k == 'op': return tstk_pop_ret( tree_op1(lst, ops, k, v) ) - if k in [ 'num', 'name', 'arr', 'fcall', 'br_s', 'str' ] and len( lst[1:] ) > 0: + if k in [ 'num', 'name', 'fcall', 'br_s', 'str' ] and len( lst[1:] ) > 0: e1 = lst[1] (k1, v1) = e1[:2] if k1 == 'op': @@ -358,6 +358,8 @@ def es_split(s): lst = name_bra(lst) + ops[0][2].append('[') # !!! + lst = tree_op(lst, ops) lst = tree_kwd(lst, kdic) @@ -422,12 +424,6 @@ def do_set(e, val, info): if k == 'name': set_val(v, val, info) return val - if k == 'arr': - idx = e[2] - i = int( do_expr(idx, info) ) - arr = get_arr_with_chk(v, i, info) - arr[i] = val - return val if e[:2] in [ [ 'op', '.' ], [ 'op', '->' ] ]: name = e[2][1] # [ 'name', xxx ] memb = e[3][1] # [ 'name', xxx ] @@ -467,6 +463,8 @@ def do_op2(v, a, b, info): if v in [ '.', '->' ]: return a.get( b[1] ) # b == [ name, xxx ] b = do_expr(b, info) + if v == '[': + return a[ int(b) ] if v == '=': return do_set(oa, b, info) if v == '+=': @@ -550,17 +548,6 @@ def do_op(v, args, info): warn_no_sup('do_op', 'term', term) -def get_arr_with_chk(name, i, info): - arr = get_val(name, info) - if i >= len(arr): - err_exit('over acc {}[{}]'.format(name, i)) - return arr - -def do_arr(name, idx, info): - i = int( do_expr(idx, info) ) - arr = get_arr_with_chk(name, i, info) - return arr[i] - def do_kwd(v, expr, info): if v == 'return': r = do_expr( expr[2], info ) @@ -612,20 +599,6 @@ def do_comma(e, info): lst = flat_comma(e) return [ do_expr(e, info) for e in lst ] -def do_type_arr(e, val, info): - idx = e[2] - n = do_expr(idx, info) - if n is not None: - n = int(n) - if val and val[:2] == [ 'br_s', '{' ]: - val = val[2][0] - val = do_comma(val, info); - if n and n > len(val): - val += [ None ] * ( n - len(val) ) - else: - val = [ None ] * n - return val - def sdef_name(name): return 'sdef@' + name @@ -636,7 +609,7 @@ def bind_body_val(lst, vals): if e[0] == 'type' or e[:2] == [ 'op', ',' ]: (r, vals) = bind_body_val( e[2:], vals ) e = e[:2] + r - elif e[0] == 'name': + elif e[0] == 'name' or e[:2] == [ 'op' ,'[' ]: e = [ 'op', '=', e, vals[0] ] vals = vals[1:] (r, vals) = bind_body_val( lst[1:], vals ) @@ -644,34 +617,54 @@ def bind_body_val(lst, vals): def do_type_struct(e, val, info): # [ 'struct', name, body ] - if val is None: - return {} (name, body) = e[1:3] if body is None: body = get_val( sdef_name(name), info ) - - vals = flat_comma( val[2][0] ) # val is [ 'br_s', '{', [ [ 'op', ',' ... ] ] ] - (r, vals) = bind_body_val( body[2], vals ) - body = body[:2] + [ r ] - + if val is not None: + vals = flat_comma( val[2][0] ) # val is [ 'br_s', '{', [ [ 'op', ',' ... ] ] ] + (r, vals) = bind_body_val( body[2], vals ) + body = body[:2] + [ r ] benv = {} do_blk(None, benv, body, info) return benv +def do_type_val(typ, arr_n, val, info): + if arr_n is False: + if typ[0] != 'struct': + if val is None: + return None + return do_expr(val, info) + return do_type_struct(typ, val, info) + + arr_n = do_expr(arr_n, info) + if arr_n is not None: + arr_n = int(arr_n) + vals = [] + if val is not None: + vals = flat_comma( val[2][0] ) # val is [ 'br_s', '{', [ [ 'op', ',' ... ] ] ] + if arr_n is None: + arr_n = len(vals) + else: + vals_n = len(vals) + if vals_n < arr_n: + vals += [ None ] * (arr_n - vals_n) + elif arr_n < vals_n: + vals = vals[:arr_n] + return [ do_type_val(typ, False, val, info) for val in vals ] + def do_type(expr, info): + typ = expr[1] for e in flat_comma( expr[2] ): + arr_n = False val = None if e[:2] == [ 'op', '=' ]: val = e[3] e = e[2] - if e[0] == 'arr': - val = do_type_arr(e, val, info) - elif expr[1][0] == 'struct': - do_sdef( expr[1], info ) - val = do_type_struct( expr[1], val, info ) - elif val: - val = do_expr(val, info) + if e[:2] == [ 'op', '[' ]: + arr_n = e[3] + e = e[2] name = e[1] + val = do_type_val(typ, arr_n, val, info) new_val(name, val, info) return None @@ -694,7 +687,7 @@ def do_expr(expr, info): if k == 'name': return get_val(v, info) if k == 'br_s': - if v in [ '(', '[' ]: # '[' for do_arr() + if v == '(': lst = expr[2] return do_expr( lst[0], info ) if len(lst) > 0 else None if v == '{': @@ -702,8 +695,6 @@ def do_expr(expr, info): return None if k == 'op': return do_op( v, expr[2:], info ) - if k == 'arr': - return do_arr( v, expr[2], info ) if k == 'fcall': (_, _, args) = expr[2] if len(args) > 0: