$OPERATORS = [ # type precedence symbols action (undef means play_operator will handle) ['prefix', 98, ['++'], undef ], ['prefix', 98, ['--'], undef ], ['postfix', 98, ['++'], undef ], ['postfix', 98, ['--'], undef ], ['infix', 96, ['**', 'pow'], sub { $_[0] ** $_[1] } ], ['prefix', 93, ['!'], sub { ! $_[0] } ], ['prefix', 93, ['-'], sub { @_ == 1 ? 0 - $_[0] : $_[0] - $_[1] } ], ['infix', 90, ['*'], sub { $_[0] * $_[1] } ], ['infix', 90, ['/'], sub { $_[0] / $_[1] } ], ['infix', 90, ['div', 'DIV'], sub { int($_[0] / $_[1]) } ], ['infix', 90, ['%', 'mod', 'MOD'], sub { $_[0] % $_[1] } ], ['infix', 85, ['+'], sub { $_[0] + $_[1] } ], ['infix', 85, ['-'], sub { @_ == 1 ? 0 - $_[0] : $_[0] - $_[1] } ], ['infix', 85, ['~', '_'], sub { join "", @_ } ], ['infix', 80, ['<'], sub { $_[0] < $_[1] } ], ['infix', 80, ['>'], sub { $_[0] > $_[1] } ], ['infix', 80, ['<='], sub { $_[0] <= $_[1] } ], ['infix', 80, ['>='], sub { $_[0] >= $_[1] } ], ['infix', 80, ['lt'], sub { $_[0] lt $_[1] } ], ['infix', 80, ['gt'], sub { $_[0] gt $_[1] } ], ['infix', 80, ['le'], sub { $_[0] le $_[1] } ], ['infix', 80, ['ge'], sub { $_[0] ge $_[1] } ], ['infix', 75, ['==', 'eq'], sub { $_[0] eq $_[1] } ], ['infix', 75, ['!=', 'ne'], sub { $_[0] ne $_[1] } ], ['infix', 70, ['&&'], undef ], ['infix', 65, ['||'], undef ], ['infix', 60, ['..'], sub { $_[0] .. $_[1] } ], ['ternary', 55, ['?', ':'], undef ], ['assign', 53, ['+='], sub { $_[0] + $_[1] } ], ['assign', 53, ['-='], sub { $_[0] - $_[1] } ], ['assign', 53, ['*='], sub { $_[0] * $_[1] } ], ['assign', 53, ['/='], sub { $_[0] / $_[1] } ], ['assign', 53, ['%='], sub { $_[0] % $_[1] } ], ['assign', 53, ['**='], sub { $_[0]** $_[1] } ], ['assign', 53, ['~=', '_='], sub { $_[0] . $_[1] } ], ['assign', 52, ['='], undef ], ['prefix', 50, ['not', 'NOT'], sub { ! $_[0] } ], ['infix', 45, ['and', 'AND'], undef ], ['infix', 40, ['or', 'OR'], undef ], ];