--- esX.py- 2016-09-11 00:00:00.000000000 +0900 +++ esX.py 2016-09-11 01:00:00.000000000 +0900 @@ -114,15 +114,30 @@ def name_bra(lst): return [ f( *lst[:pn] ) ] + name_bra(lst[pn:]) return [ lst[0] ] + name_bra(lst[1:]) +tstk = [] + +def dup_lst(v): + return [ dup_lst(e) if type(e) == list else e for e in v ]if type(v) == list else v + +def tstk_push(v): + global tstk + tstk.append( dup_lst(v) ) + +def tstk_pop_ret(v): + tstk.pop() + return v + def ops_idx(ops, term, op): i = next( ( i for (i, (term_, bind, lst)) in enumerate(ops) if term_ == term and op in lst ), None ) if i is None: + print yaml.dump(tstk) 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: + print yaml.dump(tstk) err_exit("not found rignt term op='{}'".format(v)) (k2, v2) = r[0][:2] if k2 == 'op': @@ -145,12 +160,14 @@ def op2(ops, e, k1, v1, r0): def tree_op2(lst, ops, e, k1, v1): r = tree_op( lst[2:], ops ) if len(r) == 0: + print yaml.dump(tstk) err_exit("not found right term op='{}'".format(v1)) return [ op2( ops, e, k1, v1, r[0] ) ] + r[1:] def tree_op(lst, ops): + tstk_push( [ 'op', lst ] ) if len(lst) == 0: - return lst + return tstk_pop_ret(lst) e = lst[0] (k, v) = e[:2] @@ -162,17 +179,18 @@ def tree_op(lst, ops): e = [ k, v, e[2], e[3], tree_op( [ e[4] ], ops )[0] ] if k == 'op': - return tree_op1(lst, ops, k, v) + 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: e1 = lst[1] (k1, v1) = e1[:2] if k1 == 'op': if v1 in [ '++', '--' ]: # !!! - return [ [ k1, (v1, 'back'), e ] ] + tree_op( lst[2:], ops ) - return tree_op2(lst, ops, e, k1, v1) + ret = [ [ k1, (v1, 'back'), e ] ] + tree_op( lst[2:], ops ) + return tstk_pop_ret(ret) + return tstk_pop_ret( tree_op2(lst, ops, e, k1, v1) ) - return [ e ] + tree_op( lst[1:], ops ) + return tstk_pop_ret( [ e ] + tree_op( lst[1:], ops ) ) def tree_kwd(lst, kdic): if len(lst) == 0: