--- esq.py- 2016-09-22 00:00:00.000000000 +0900 +++ esq.py 2016-09-23 00:00:00.000000000 +0900 @@ -234,6 +234,8 @@ def tree_kwd(lst, kdic): if v == 'struct': (name, i) = ( lst[1][1], 2 ) if top_is( lst[1:], [ 'name' ] ) else (None, 1) (body, i) = ( lst[i], i+1 ) if top_is( lst[i:], [ 'br_s', '{' ] ) else (None, i) + if body is not None: + body = body[:2] + [ tree_kwd( body[2], kdic ) ] e = [ 'struct', name, body ] grp = 'sdef' if top_is( lst[i:], [ 'etc', ';' ] ) else 'type' e = [ grp, e ] @@ -627,6 +629,19 @@ def do_type_arr(e, val, info): def sdef_name(name): return 'sdef@' + name +def bind_body_val(lst, vals): + if len(lst) == 0 or len(vals) == 0: + return (lst, vals) + e = lst[0] + if e[0] == 'type' or e[:2] == [ 'op', ',' ]: + (r, vals) = bind_body_val( e[2:], vals ) + e = e[:2] + r + elif e[0] == 'name': + e = [ 'op', '=', e, vals[0] ] + vals = vals[1:] + (r, vals) = bind_body_val( lst[1:], vals ) + return ( [ e ] + r, vals) + def do_type_struct(e, val, info): # [ 'struct', name, body ] if val is None: @@ -634,12 +649,14 @@ def do_type_struct(e, val, info): (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 ] + benv = {} do_blk(None, benv, body, info) - names = benv.get('@order') - vals = do_comma(val[2][0], info) # val is [ 'br_s', '{', [ [ 'op', ',' ... ] ] ] - vals += [ None ] * ( len(names) - len(vals) ) - return dict( zip(names, vals) ) + return benv def do_type(expr, info): for e in flat_comma( expr[2] ): @@ -650,6 +667,7 @@ def do_type(expr, info): 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) @@ -657,9 +675,9 @@ def do_type(expr, info): new_val(name, val, info) return None -def do_sdef(expr, info): - # [ 'sdef', [ 'struct', name, body ] ] - (name, body) = expr[1][1:3] +def do_sdef(e, info): + # [ 'struct', name, body ] + (name, body) = e[1:3] if name and body: new_val( sdef_name(name), body, info ) @@ -694,7 +712,7 @@ def do_expr(expr, info): if k == 'type': return do_type(expr, info) if k == 'sdef': - return do_sdef(expr, info) + return do_sdef(expr[1], info) if k in [ 'fproto', 'etc', 'fdef' ]: # do nothing !!! return None