--- esN.py- 2016-09-08 02:20:00.000000000 +0900 +++ esN.py 2016-09-08 03:00:00.000000000 +0900 @@ -197,6 +197,12 @@ def tree_kwd(lst, kdic): if top_is(r, 'kwd', 'else'): e += [ r.pop(0)[2] ] return [ e ] + r + if v == 'while' and len( lst[2:] ) > 0: + if lst[1][:2] != [ 'br_s', '(' ]: + err_exit("not found '(' after 'while'") + r = tree_kwd( lst[2:], kdic ) + e = [ k, v, lst[1], r.pop(0) ] + return [ e ] + r e = e[:2] + tree_kwd( e[2:], kdic ) return step(e, 1) @@ -253,7 +259,7 @@ def es_split(s): 'br_e' : [ ')', ']', '}' ], 'op' : ops_flat, 'type' : [ 'int', 'char', 'void' ], - 'kwd' : [ 'return', 'if', 'else' ], + 'kwd' : [ 'return', 'if', 'else', 'while' ], 'spc' : [ ' ', '\t', '\n' ], 'etc' : [ ';', ',' ], } @@ -340,6 +346,16 @@ def do_op2(v, a, b, info): return a / b if v == '==': return a == b + if v == '!=': + return a != b + if v == '<=': + return a <= b + if v == '<': + return a < b + if v == '>=': + return a >= b + if v == '>': + return a > b warn_no_sup('do_op2', 'v', v) @@ -366,21 +382,30 @@ def do_arr(name, idx, info): get_env(info)[name] = [ None ] * i # new return None +def do_kwd(v, expr, info): + if v == 'return': + r = do_expr( expr[2], info ) + get_call_inf(info)['ret'] = r + return None + if v == 'if': + if do_expr( expr[2], info ): + do_expr( expr[3], info ) + elif len(expr) > 4: + do_expr( expr[4], info ) + return None + if v == 'while': + while do_expr( expr[2], info ): + do_expr( expr[3], info ) + return None + + warn_no_sup('do_kwd', 'v', v) + def do_expr(expr, info): if info.get('verb') >= 2: print('expr={}'.format(expr)) (k, v) = expr[:2] if k == 'kwd': - if v == 'return': - r = do_expr( expr[2], info ) - get_call_inf(info)['ret'] = r - return None - if v == 'if': - if do_expr( expr[2], info ): - do_expr( expr[3], info ) - elif len(expr) > 4: - do_expr( expr[4], info ) - return None + return do_kwd(v, expr, info) if k == 'num': return float(v) if k == 'str': @@ -388,8 +413,12 @@ def do_expr(expr, info): if k == 'name': return get_env(info).get(v) if k == 'br_s': - e = expr[2][0] - return do_expr(e, info) + if v == '(': + e = expr[2][0] + return do_expr(e, info) + if v == '{': + do_blk(expr, info) + return None if k == 'op': return do_op( v, expr[2:], info ) if k == 'arr':