--- es_e.py- 2016-10-02 01:00:00.000000000 +0900 +++ es_e.py 2016-10-03 00:00:00.000000000 +0900 @@ -70,7 +70,7 @@ def join_type(top, lst): if top is None: i = next( ( i for (i, e) in enumerate(lst) if e[0] == 'type' ), None ) return lst if i is None else lst[:i] + join_type( lst[i], lst[i+1:] ) - i = next( ( i for (i, e) in enumerate(lst) if e[0] == 'type' or e == [ 'op', '*' ] ), None ) + i = next( ( i for (i, e) in enumerate(lst) if e[0] == 'type' ), None ) to_len2 = lambda e: [ e[0], e[1:] ] if i is None: return [ to_len2(top) ] + lst @@ -244,6 +244,11 @@ def tree_kwd(lst, kdic): e = e[:2] + tree_kwd( e[2:], kdic ) return step(e, 1) +def tree_type_ptr_exp(e): + if e[:2] == [ 'op', '*' ]: + return [ '*' ] + tree_type_ptr_exp( e[2] ) + return [ e ] + def tree_type(lst): if len(lst) == 0: return lst @@ -265,6 +270,10 @@ def tree_type(lst): f = lambda s: s[:2] + [ tree_type_br_s( s[2] ) ] e = e[:1] + [ f( e[1] ) ] if e[0] == 'type' and len( lst[1:] ) > 0: + if lst[1][:2] == [ 'op', '*' ]: + exp = tree_type_ptr_exp( lst[1] ) + if exp[-1][0] in [ 'fdef', 'fcall' ]: + return tree_type( [ e + exp[:-1] , exp[-1] ] + lst[2:] ) if lst[1][0] == 'fdef': fdef = tree_type( [ lst[1] ] )[0] e = fdef[:3] + [ e ] + fdef[4:] @@ -628,7 +637,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' or e[:2] == [ 'op' ,'[' ]: + elif e[0] == 'name' or e[:2] in [ [ 'op' ,'[' ], [ 'op', '*' ] ]: e = [ 'op', '=', e, vals[0] ] vals = vals[1:] (r, vals) = bind_body_val( lst[1:], vals ) @@ -692,6 +701,8 @@ def do_type(expr, info): if e[:2] == [ 'op', '=' ]: val = e[3] e = e[2] + while e[:2] == [ 'op', '*' ]: + e = e[2] # !!! if e[:2] == [ 'op', '[' ]: arr_n = e[3] e = e[2]