--- esF.py- 2016-09-04 00:00:00.000000000 +0900 +++ esF.py 2016-09-05 00:00:00.000000000 +0900 @@ -86,6 +86,34 @@ def tree_bra(lst, kdic, sta=None): dst.append(e) return dst +def is_match(lst, pat): + ckf = lambda a, b, f_eq: len(a) >= len(b) and next( + ( False for (a1, b1) in zip(a, b) if not f_eq(a1, b1) ), True ) + f = lambda e, p: ckf(e, p, lambda a1, b1: a1 == b1) + return ckf(lst, pat, f) + +def name_bra(lst): + if len(lst) == 0: + return 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) ] ] ], + [ [ [ 'type' ], [ 'name' ], [ 'br_s', '(' ] ], + 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', '[' ] ], + lambda name, (k, v, idx): [ 'arr', name[1], [ k, v, name_bra(idx) ] ] ], + [ [ [ 'br_s' ] ], + 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 [ lst[0] ] + name_bra(lst[1:]) + def es_split(s): s = s.replace('@', '@ ') @@ -119,7 +147,7 @@ def es_split(s): #print('encode:\n{}\n'.format(s)) lst = div_str_cut_comment(s, kdic, tbl) - print('div_str:\n{}\n'.format(lst)) + #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 ) @@ -135,6 +163,8 @@ def es_split(s): lst = tree_bra(lst, kdic) + lst = name_bra(lst) + return lst if __name__ == "__main__": @@ -145,7 +175,7 @@ if __name__ == "__main__": with open(sys.argv[1], 'r') as f: s = f.read() lst = es_split(s) - print('{}\n'.format(lst)) + #print('{}\n'.format(lst)) print yaml.dump(lst) sys.exit(rcode) # EOF