--- esH.py- 2016-09-06 00:00:00.000000000 +0900 +++ esH.py 2016-09-06 23:00:00.000000000 +0900 @@ -100,7 +100,7 @@ def name_bra(lst): lambda type, name, (k, v, args), (k2, v2, 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) ] ] ], [ [ [ 'name' ], [ 'br_s', '[' ] ], @@ -120,6 +120,30 @@ def ops_idx(ops, term, op): err_exit("not found term={} op='{}' in ops".format(term, op)) return i +def tree_op1(lst, ops, k, v): + r = tree_op( lst[1:], ops ) + if len(r) == 0: + err_exit("not found rignt term op='{}'".format(v)) + (k2, v2) = r[0][:2] + if k2 == 'op': + i1 = ops_idx(ops, 1, v) + i2 = ops_idx( ops, len( r[0][2:] ), v2 ) + if i1 < i2 or (i1 == i2 and ops[i1][1] == '>'): + return [ [ k2, v2, [ k, v, r[0][2] ] ] + r[0][3:] ] + r[1:] + return [ [ k, v, r[0] ] ] + r[1:] + +def tree_op2(lst, ops, e, k1, v1): + r = tree_op( lst[2:], ops ) + if len(r) == 0: + err_exit("not found right term op='{}'".format(v1)) + (k2, v2) = r[0][:2] + if k2 == 'op': + i1 = ops_idx(ops, 2, v1) + i2 = ops_idx( ops, len( r[0][2:] ), v2 ) + if i1 < i2 or (i1 == i2 and ops[i1][1] == '>'): + return [ [ k2, v2, [ k1, v1, e, r[0][2] ], r[0][3] ] ] + r[1:] + return [ [ k1, v1, e, r[0] ] ] + r[1:] + def tree_op(lst, ops): if len(lst) == 0: return lst @@ -134,34 +158,34 @@ def tree_op(lst, ops): e = [ k, v, e[2], e[3], tree_op( [ e[4] ], ops )[0] ] if k == 'op': - r = tree_op( lst[1:], ops ) - if len(r) == 0: - err_exit("not found rignt term op='{}'".format(v)) - (k2, v2) = r[0][:2] - if k2 == 'op': - i1 = ops_idx(ops, 1, v) - i2 = ops_idx( ops, len( r[0][2:] ), v2 ) - if i1 < i2 or (i1 == i2 and ops[i1][1] == '>'): - return [ [ k2, v2, [ k, v, r[0][2] ] ] + r[0][3:] ] + r[1:] - return [ [ k, v, r[0] ] ] + r[1:] + return tree_op1(lst, ops, k, v) if k in [ 'num', 'name', 'arr', 'fcall', 'br_s' ] and len( lst[1:] ) > 0: e1 = lst[1] (k1, v1) = e1[:2] if k1 == 'op': - r = tree_op( lst[2:], ops ) - if len(r) == 0: - err_exit("not found right term op='{}'".format(v1)) - (k2, v2) = r[0][:2] - if k2 == 'op': - i1 = ops_idx(ops, 2, v1) - i2 = ops_idx( ops, len( r[0][2:] ), v2 ) - if i1 < i2 or (i1 == i2 and ops[i1][1] == '>'): - return [ [ k2, v2, [ k1, v1, e, r[0][2] ], r[0][3] ] ] + r[1:] - return [ [ k1, v1, e, r[0] ] ] + r[1:] + return tree_op2(lst, ops, e, k1, v1) return [ e ] + tree_op( lst[1:], ops ) +def tree_kwd(lst, kdic): + if len(lst) == 0: + return lst + e = lst[0] + step = lambda e, i: [ e ] + tree_kwd( lst[i:], kdic ) + if type(e) is not list: + return step(e, 1) + (k, v) = e[:2] + if k == 'br_s': + e = [ k, v, tree_kwd( e[2], kdic ) ] + return step(e, 1) + if k == 'kwd': + if v in [ 'return' ] and len( lst[1:] ) > 0: + e = [ k, v, lst[1] ] + return step(e, 2) + e = e[:2] + tree_kwd( e[2:], kdic ) + return step(e, 1) + def es_split(s): s = s.replace('@', '@ ') @@ -230,13 +254,10 @@ def es_split(s): kf = lambda (k, s1, d1, ec): len(s1) tbl = sorted(tbl, key=kf, reverse=True) - #print('tbl:\n{}\n'.format(tbl)) s = encode(s, tbl) - #print('encode:\n{}\n'.format(s)) lst = div_str_cut_comment(s, kdic, tbl) - #print('div_str:\n{}\n'.format(lst)) dec_split = lambda s: decode(s, tbl, add_spc=True).split() get_k = lambda s1: next( ( k for (k, s1_, d1, ec) in tbl if s1_ == s1 ), None ) @@ -256,6 +277,8 @@ def es_split(s): lst = tree_op(lst, ops) + lst = tree_kwd(lst, kdic) + return lst def err_exit(msg, rcode=1): @@ -270,7 +293,6 @@ if __name__ == "__main__": with open(sys.argv[1], 'r') as f: s = f.read() lst = es_split(s) - #print('{}\n'.format(lst)) print yaml.dump(lst) sys.exit(rcode) # EOF