===============================================================================
Integer Number
===============================================================================
4
-------------------------------------------------------------------------------
(expression (number (number_value)))

===============================================================================
Floating Number
===============================================================================
4.0
-------------------------------------------------------------------------------
(expression (number (number_value)))

===============================================================================
Binary Number
===============================================================================
0b0001110101010101010101010100111111000
-------------------------------------------------------------------------------
(expression (number (number_value)))

===============================================================================
Ternary Number
===============================================================================
0t0012120012
-------------------------------------------------------------------------------
(expression (number (number_value)))

===============================================================================
Octal Number
===============================================================================
0o1234345652323421
-------------------------------------------------------------------------------
(expression (number (number_value)))

===============================================================================
Hexadecimal Number
===============================================================================
0xABBCC00FF
-------------------------------------------------------------------------------
(expression (number (number_value)))

===============================================================================
Scientific Number Format
===============================================================================
1.23E+10
-------------------------------------------------------------------------------
(expression (number (number_value)))

===============================================================================
Number Suffix
===============================================================================
23423423424ULL
-------------------------------------------------------------------------------
(expression (number (number_value) (number_suffix)))

===============================================================================
Number Unit MiB
===============================================================================
0x1023MiB
-------------------------------------------------------------------------------
(expression (number (number_value) (number_unit)))

===============================================================================
Number Unit PiB
===============================================================================
2PiB
-------------------------------------------------------------------------------
(expression (number (number_value) (number_unit)))

===============================================================================
Number Unit EiB
===============================================================================
4EiB
-------------------------------------------------------------------------------
(expression (number (number_value) (number_unit)))

===============================================================================
Function with simple arguments
===============================================================================
func(a, b, c)
-------------------------------------------------------------------------------
(expression
  (function
    (function_name)
    (argument_list
      (argument (variable))
      (argument (variable))
      (argument (variable)))))

===============================================================================
Function with expression arguments
===============================================================================
f(1 + 2, x * y)
-------------------------------------------------------------------------------
(expression
  (function
    (function_name)
    (argument_list
      (argument (sum left: (number (number_value)) right: (number (number_value))))
      (argument (product left: (variable) right: (variable))))))

===============================================================================
Variable
===============================================================================
x
-------------------------------------------------------------------------------
(expression (variable))

===============================================================================
Variable with dots (Rizin flag)
===============================================================================
y + sym.func.1000055d4
-------------------------------------------------------------------------------
(expression
  (sum left: (variable) right: (variable)))

===============================================================================
Special variable $$
===============================================================================
$$
-------------------------------------------------------------------------------
(expression (special_variable))

===============================================================================
Special variable $S
===============================================================================
$S
-------------------------------------------------------------------------------
(expression (special_variable))

===============================================================================
Special variable $F arithmetic
===============================================================================
$F + 0x10
-------------------------------------------------------------------------------
(expression
  (sum left: (special_variable) right: (number (number_value))))

===============================================================================
Address with little-endian width
===============================================================================
0x1234:le32
-------------------------------------------------------------------------------
(expression (address_typed (number_value) (address_width)))

===============================================================================
Address with big-endian width
===============================================================================
0xDEADBEEF:be64
-------------------------------------------------------------------------------
(expression (address_typed (number_value) (address_width)))

===============================================================================
Address with bare width
===============================================================================
0x1000:8
-------------------------------------------------------------------------------
(expression (address_typed (number_value) (address_width)))

===============================================================================
String-as-bytes
===============================================================================
"ABC"
-------------------------------------------------------------------------------
(expression (string_bytes))

===============================================================================
String-as-bytes in arithmetic
===============================================================================
"AB" + 1
-------------------------------------------------------------------------------
(expression
  (sum left: (string_bytes) right: (number (number_value))))

===============================================================================
Assignment
===============================================================================
x = y + 4.0
-------------------------------------------------------------------------------
(expression
  (assignment
    left: (variable)
    right: (sum
      left: (variable)
      right: (number (number_value)))))

===============================================================================
Let binding
===============================================================================
let x = y + 4.0
-------------------------------------------------------------------------------
(expression
  (let_assignment
    left: (variable)
    right: (sum
      left: (variable)
      right: (number (number_value)))))

===============================================================================
Variable Increment
===============================================================================
++x
-------------------------------------------------------------------------------
(expression (increment right: (variable)))

===============================================================================
Variable Decrement
===============================================================================
--x
-------------------------------------------------------------------------------
(expression (decrement right: (variable)))

===============================================================================
Unary minus on number
===============================================================================
-1
-------------------------------------------------------------------------------
(expression (unary_minus right: (number (number_value))))

===============================================================================
Unary plus on number
===============================================================================
+0x10
-------------------------------------------------------------------------------
(expression (unary_plus right: (number (number_value))))

===============================================================================
Unary minus on expression
===============================================================================
-(x + 1)
-------------------------------------------------------------------------------
(expression
  (unary_minus right: (parenthesized_expression
    (sum left: (variable) right: (number (number_value))))))

===============================================================================
Unary minus has higher precedence than multiplication
===============================================================================
-x * y
-------------------------------------------------------------------------------
(expression
  (product
    left: (unary_minus right: (variable))
    right: (variable)))

===============================================================================
Subtraction is binary not unary
===============================================================================
1 - 2
-------------------------------------------------------------------------------
(expression
  (subtraction
    left: (number (number_value))
    right: (number (number_value))))

===============================================================================
Addition
===============================================================================
x + 4.0
-------------------------------------------------------------------------------
(expression
  (sum
    left: (variable)
    right: (number (number_value))))

===============================================================================
Multiplication
===============================================================================
x * 4.0
-------------------------------------------------------------------------------
(expression
  (product
    left: (variable)
    right: (number (number_value))))

===============================================================================
Multiplication and addition precedence
===============================================================================
x * y + z
-------------------------------------------------------------------------------
(expression
  (sum
    left: (product left: (variable) right: (variable))
    right: (variable)))

===============================================================================
Division
===============================================================================
4 / x
-------------------------------------------------------------------------------
(expression
  (division
    left: (number (number_value))
    right: (variable)))

===============================================================================
Modulo (mod keyword)
===============================================================================
14 mod x
-------------------------------------------------------------------------------
(expression
  (modulo
    left: (number (number_value))
    right: (variable)))

===============================================================================
Modulo (% operator)
===============================================================================
14 % x
-------------------------------------------------------------------------------
(expression
  (modulo
    left: (number (number_value))
    right: (variable)))

===============================================================================
Exponent
===============================================================================
x ** y
-------------------------------------------------------------------------------
(expression
  (exponent
    base: (variable)
    exponent: (variable)))

===============================================================================
Exponent is right-associative
===============================================================================
x ** 4 ** z
-------------------------------------------------------------------------------
(expression
  (exponent
    base: (variable)
    exponent: (exponent
      base: (number (number_value))
      exponent: (variable))))

===============================================================================
Logarithm
===============================================================================
x log y
-------------------------------------------------------------------------------
(expression
  (logarithm base: (variable) exponent: (variable)))

===============================================================================
Bitwise NOT
===============================================================================
~x
-------------------------------------------------------------------------------
(expression (logical_negation right: (variable)))

===============================================================================
Logical NOT
===============================================================================
!x
-------------------------------------------------------------------------------
(expression (logical_not right: (variable)))

===============================================================================
Bitwise AND
===============================================================================
x & y
-------------------------------------------------------------------------------
(expression (logical_and left: (variable) right: (variable)))

===============================================================================
Bitwise OR
===============================================================================
x | y
-------------------------------------------------------------------------------
(expression (logical_or left: (variable) right: (variable)))

===============================================================================
Bitwise XOR
===============================================================================
x ^ y
-------------------------------------------------------------------------------
(expression (logical_xor left: (variable) right: (variable)))

===============================================================================
Logical SHL
===============================================================================
x << y
-------------------------------------------------------------------------------
(expression (logical_shl left: (variable) right: (variable)))

===============================================================================
Logical SHR
===============================================================================
x >> y
-------------------------------------------------------------------------------
(expression (logical_shr left: (variable) right: (variable)))

===============================================================================
Logical ROL
===============================================================================
x <<< y
-------------------------------------------------------------------------------
(expression (logical_rol left: (variable) right: (variable)))

===============================================================================
Logical ROR
===============================================================================
x >>> y
-------------------------------------------------------------------------------
(expression (logical_ror left: (variable) right: (variable)))

===============================================================================
Less than
===============================================================================
a < b
-------------------------------------------------------------------------------
(expression (less_than left: (variable) right: (variable)))

===============================================================================
Less or equal
===============================================================================
a <= b
-------------------------------------------------------------------------------
(expression (less_equal left: (variable) right: (variable)))

===============================================================================
Greater than
===============================================================================
a > b
-------------------------------------------------------------------------------
(expression (greater_than left: (variable) right: (variable)))

===============================================================================
Greater or equal
===============================================================================
a >= b
-------------------------------------------------------------------------------
(expression (greater_equal left: (variable) right: (variable)))

===============================================================================
Equal
===============================================================================
a == b
-------------------------------------------------------------------------------
(expression (equal left: (variable) right: (variable)))

===============================================================================
Not equal
===============================================================================
a != b
-------------------------------------------------------------------------------
(expression (not_equal left: (variable) right: (variable)))

===============================================================================
Comparison with arithmetic
===============================================================================
a + 1 < b * 2
-------------------------------------------------------------------------------
(expression
  (less_than
    left: (sum left: (variable) right: (number (number_value)))
    right: (product left: (variable) right: (number (number_value)))))

===============================================================================
Parenthesised expression
===============================================================================
(z + x) * y
-------------------------------------------------------------------------------
(expression
  (product
    left: (parenthesized_expression
      (sum left: (variable) right: (variable)))
    right: (variable)))

===============================================================================
Parentheses with exponents and division
===============================================================================
(z + x) ** ((y / 2) - 1)
-------------------------------------------------------------------------------
(expression
  (exponent
    base: (parenthesized_expression
      (sum left: (variable) right: (variable)))
    exponent: (parenthesized_expression
      (subtraction
        left: (parenthesized_expression
          (division left: (variable) right: (number (number_value))))
        right: (number (number_value))))))

===============================================================================
Shift binds tighter than bitwise OR
===============================================================================
a | b << 2
-------------------------------------------------------------------------------
(expression
  (logical_or
    left: (variable)
    right: (logical_shl left: (variable) right: (number (number_value)))))

===============================================================================
Bitwise AND binds tighter than XOR which binds tighter than OR
===============================================================================
a | b ^ c & d
-------------------------------------------------------------------------------
(expression
  (logical_or
    left: (variable)
    right: (logical_xor
      left: (variable)
      right: (logical_and left: (variable) right: (variable)))))

===============================================================================
Unicode identifier (Greek)
===============================================================================
αβγ
-------------------------------------------------------------------------------
(expression (variable))

===============================================================================
Unicode identifier (Han)
===============================================================================
半径
-------------------------------------------------------------------------------
(expression (variable))

===============================================================================
Unicode identifier (Arabic)
===============================================================================
متغير
-------------------------------------------------------------------------------
(expression (variable))

===============================================================================
Unicode function name (Han)
===============================================================================
最大(5, 3)
-------------------------------------------------------------------------------
(expression
  (function
    (function_name)
    (argument_list
      (argument (number (number_value)))
      (argument (number (number_value))))))

===============================================================================
Unicode variable binding and reference (Japanese)
===============================================================================
(変数 = 7) + 変数
-------------------------------------------------------------------------------
(expression
  (sum
    left: (parenthesized_expression
      (assignment
        left: (variable)
        right: (number (number_value))))
    right: (variable)))

===============================================================================
Variable starting with reserved-word prefix is allowed
===============================================================================
modulus + logger + letter
-------------------------------------------------------------------------------
(expression
  (sum
    left: (sum left: (variable) right: (variable))
    right: (variable)))

===============================================================================
Bare let is rejected at parse time
===============================================================================
let
-------------------------------------------------------------------------------
(ERROR)

===============================================================================
Bare mod parses as identifier (rejected by the evaluator)
===============================================================================
mod
-------------------------------------------------------------------------------
(expression (variable))

===============================================================================
Bare log parses as identifier (rejected by the evaluator)
===============================================================================
log
-------------------------------------------------------------------------------
(expression (variable))


===============================================================================
Scientific notation requires exponent digits
===============================================================================
1.5e10
-------------------------------------------------------------------------------
(expression (number (number_value)))

===============================================================================
Hex P-exponent
===============================================================================
0x1.8p3
-------------------------------------------------------------------------------
(expression (number (number_value)))

===============================================================================
Negative exponent
===============================================================================
1.5e-3
-------------------------------------------------------------------------------
(expression (number (number_value)))

===============================================================================
Address typed in arithmetic
===============================================================================
0x1000:le32 + 4
-------------------------------------------------------------------------------
(expression
  (sum
    left: (address_typed (number_value) (address_width))
    right: (number (number_value))))

===============================================================================
Hex literal that overflows ut64
===============================================================================
0xffffffffffffffffffffffffffff
-------------------------------------------------------------------------------
(expression (number (number_value)))

===============================================================================
Bit-vector width suffix
===============================================================================
0xffu8
-------------------------------------------------------------------------------
(expression (number (number_value) (number_suffix)))

===============================================================================
Bit-vector arithmetic
===============================================================================
200u8 + 100u8
-------------------------------------------------------------------------------
(expression
  (sum
    left: (number (number_value) (number_suffix))
    right: (number (number_value) (number_suffix))))

===============================================================================
Statement sequence with semicolons
===============================================================================
1; 2; 3
-------------------------------------------------------------------------------
(expression
  (number (number_value))
  (number (number_value))
  (number (number_value)))

===============================================================================
Signed division
===============================================================================
10 sdiv 3
-------------------------------------------------------------------------------
(expression
  (signed_division
    left: (number (number_value))
    right: (number (number_value))))

===============================================================================
Signed modulo
===============================================================================
10 smod 3
-------------------------------------------------------------------------------
(expression
  (signed_modulo
    left: (number (number_value))
    right: (number (number_value))))

===============================================================================
Arithmetic shift right
===============================================================================
0xff00 sar 4
-------------------------------------------------------------------------------
(expression
  (arith_shr
    left: (number (number_value))
    right: (number (number_value))))

===============================================================================
Typed read signed width
===============================================================================
0x1000:s32
-------------------------------------------------------------------------------
(expression
  (address_typed
    (number_value)
    (address_width)))

===============================================================================
Typed read float width
===============================================================================
0x1000:lef32
-------------------------------------------------------------------------------
(expression
  (address_typed
    (number_value)
    (address_width)))

===============================================================================
Typed read half-precision float
===============================================================================
0x1000:f16
-------------------------------------------------------------------------------
(expression
  (address_typed
    (number_value)
    (address_width)))

===============================================================================
Ternary conditional
===============================================================================
1 ? 10 : 20
-------------------------------------------------------------------------------
(expression
  (conditional
    condition: (number (number_value))
    consequence: (number (number_value))
    alternative: (number (number_value))))

===============================================================================
Ternary is right-associative
===============================================================================
a ? b : c ? d : e
-------------------------------------------------------------------------------
(expression
  (conditional
    condition: (variable)
    consequence: (variable)
    alternative: (conditional
      condition: (variable)
      consequence: (variable)
      alternative: (variable))))

===============================================================================
Ternary with typed-read branch
===============================================================================
1 ? 0x1000:le32 : 0
-------------------------------------------------------------------------------
(expression
  (conditional
    condition: (number (number_value))
    consequence: (address_typed
      (number_value)
      (address_width))
    alternative: (number (number_value))))

===============================================================================
Typed read quad-precision float
===============================================================================
0x1000:f128
-------------------------------------------------------------------------------
(expression
  (address_typed
    (number_value)
    (address_width)))
