--- esl.py- 2016-09-16 00:00:00.000000000 +0900 +++ esl.py 2016-09-17 00:00:00.000000000 +0900 @@ -292,7 +292,7 @@ def es_split(s): [ 2, '>', [ '&&' ] ], [ 2, '>', [ '||' ] ], [ 3, '<', [ '?', ':' ] ], - [ 2, '<', [ '=', '+=', '-=', '*=', '/=', '%=', '&=', '|=', '^=', '~=', '>>=', '<<=' ] ], + [ 2, '<', [ '=', '+=', '-=', '*=', '/=', '%=', '&=', '|=', '^=', '>>=', '<<=' ] ], [ 2, '>', [ ',' ] ], # ... ] @@ -416,6 +416,10 @@ def do_op1(v, a, info): a = do_expr(a, info) if v == '-': return -a + if v == '!': + return not a + if v == '~': + return ~a if v == '++': return do_set(oa, a+1, info) if v == '--': @@ -441,6 +445,30 @@ def do_op2(v, a, b, info): if v == '-=': a -= b return do_set(oa, a, info) + if v == '*=': + a *= b + return do_set(oa, a, info) + if v == '/=': + a /= b + return do_set(oa, a, info) + if v == '%=': + a %= b + return do_set(oa, a, info) + if v == '&=': + a &= b + return do_set(oa, a, info) + if v == '|=': + a |= b + return do_set(oa, a, info) + if v == '^=': + a ^= b + return do_set(oa, a, info) + if v == '>>=': + a >>= b + return do_set(oa, a, info) + if v == '<<=': + a <<= b + return do_set(oa, a, info) if v == '+': return a + b @@ -450,6 +478,12 @@ 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 == '!=': @@ -462,6 +496,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 and b + if v == '||': + return a or b if v == ',': return b @@ -501,6 +545,8 @@ def do_kwd(v, expr, info): if v == 'while': while do_expr( expr[2], info ): do_expr( expr[3], info ) + if 'ret' in info: + break if was_flags(info, 'break'): break was_flags(info, 'continue') @@ -514,6 +560,8 @@ def do_kwd(v, expr, info): do_expr( args[0], info ) while do_expr( args[1], info ): do_expr( expr[3], info ) + if 'ret' in info: + break if was_flags(info, 'break'): break was_flags(info, 'continue')