--- esI.py- 2016-09-06 23:00:00.000000000 +0900 +++ esI.py 2016-09-07 00:00:00.000000000 +0900 @@ -281,6 +281,41 @@ def es_split(s): return lst +def do_expr(expr, info): + (k, v) = expr[:2] + if k == 'kwd' and v == 'return': + r = do_expr( expr[2], info ) + info.get('call_stk')[-1]['ret'] = r + return r + return 123 # !!! + +def do_blk(blk, info): + (_, _, lst) = blk # [ 'br_s', '{', lst ] + call_inf = info.get('call_stk')[-1] + for expr in lst: + do_expr(expr, info) + if 'ret' in call_inf: + return call_inf.get('ret') + +def do_fcall(name, args, info): + lst = info.get('lst') + + f = lambda (k, nm): k == 'fdef' and nm == name + fdef = next( ( e for e in lst if f( e[:2] ) ), None ) + if fdef is None: + err_exit("not found fdef '{}'".format(name)) + + (args_info, ret_type, body) = fdef[2:] + + names = [ e[1] for e in args_info if e[0] == 'name' ] + env = dict( zip(names, args) ) + + call_stk = info.get('call_stk') + call_stk.append( { 'name' : name, 'env' : env } ) + do_blk(body, info) + call_inf = call_stk.pop() + return call_inf.get('ret', None) + def err_exit(msg, rcode=1): print('Err {}'.format(msg)) sys.exit(rcode) @@ -294,5 +329,10 @@ if __name__ == "__main__": s = f.read() lst = es_split(s) print yaml.dump(lst) + + argv = sys.argv[1:] + args = [ len(argv), argv ] + info = { 'lst' : lst, 'call_stk' : [] } + rcode = do_fcall( 'main', args, info ) sys.exit(rcode) # EOF