========================================
operators and calls
========================================

let answer := ( a + b * c ** d ) and? fallback;
let text := "a" _ "b" _ "c";
let bytes := 'raw';
let path_value := data @ "friends/#0/name";
let all_values := data @@ "friends/*/name";
let has_value := data @? "settings/light";
let chained := input ▷ trim(^^) ▷ length(^^);
let implied := allowed onlyif? enabled;
let bitwise := ( flags & mask ) | extra;
let compare := name eqi "zuzu" and count >= 1;
let template := `Did you know ${foo} plus ${bar} is ${ foo + bar }?`;

---

(source_file
  (variable_declaration
    (binding_identifier
      (identifier))
    (binary_expression
      (parenthesized_expression
        (binary_expression
          (identifier)
          (binary_expression
            (identifier)
            (binary_expression
              (identifier)
              (identifier)))))
      (identifier)))
  (variable_declaration
    (binding_identifier
      (identifier))
    (binary_expression
      (binary_expression
        (string
          (double_quoted_string))
        (string
          (double_quoted_string)))
      (string
        (double_quoted_string))))
  (variable_declaration
    (binding_identifier
      (identifier))
    (string
      (single_quoted_string)))
  (variable_declaration
    (binding_identifier
      (identifier))
    (binary_expression
      (identifier)
      (string
        (double_quoted_string))))
  (variable_declaration
    (binding_identifier
      (identifier))
    (binary_expression
      (identifier)
      (string
        (double_quoted_string))))
  (variable_declaration
    (binding_identifier
      (identifier))
    (binary_expression
      (identifier)
      (string
        (double_quoted_string))))
  (variable_declaration
    (binding_identifier
      (identifier))
    (chain_expression
      (chain_expression
        (identifier)
        (call_expression
          (identifier)
          (argument_list
            (placeholder))))
      (unary_expression
        (parenthesized_expression
          (placeholder)))))
  (variable_declaration
    (binding_identifier
      (identifier))
    (binary_expression
      (identifier)
      (identifier)))
  (variable_declaration
    (binding_identifier
      (identifier))
    (binary_expression
      (parenthesized_expression
        (binary_expression
          (identifier)
          (identifier)))
      (identifier)))
  (variable_declaration
    (binding_identifier
      (identifier))
    (binary_expression
      (binary_expression
        (identifier)
        (string
          (double_quoted_string)))
      (binary_expression
        (identifier)
        (number))))
  (variable_declaration
    (binding_identifier
      (identifier))
    (template_string
      (template_fragment)
      (template_interpolation
        (identifier))
      (template_fragment)
      (template_interpolation
        (identifier))
      (template_fragment)
      (template_interpolation
        (binary_expression
          (identifier)
          (identifier)))
      (template_fragment))))

========================================
literals and postfix
========================================

let rows := [
	{ name: "Ada", score: 3, "quoted": 4, somevar _ somevar2: 5, (dynamic): 6 },
	{ name: "Bea", score: 4 },
];

let pairs := {{ name: "Zuzu", score: 5, "quoted": 6, somevar _ somevar2: 7, (dynamic): 8 }};
let bag := <<< "a", "b", "a" >>>;
let set := << 1, 2, 3 >>;
let empty := ∅;
let value := rows[0]{name}.lc();
let slice := rows[0:2];
rows.push( name: "Cal", score: 5, "quoted": 6, somevar _ somevar2: 7, (dynamic): 8 );
counter++;

---

(source_file
  (variable_declaration
    (binding_identifier
      (identifier))
    (list_literal
      (dict_literal
        (pair_entry
          (bare_key
            (identifier))
          (string
            (double_quoted_string)))
        (pair_entry
          (bare_key
            (identifier))
          (number))
        (pair_entry
          (string
            (double_quoted_string))
          (number))
        (pair_entry
          (binary_expression
            (identifier)
            (identifier))
          (number))
        (pair_entry
          (parenthesized_expression
            (identifier))
          (number)))
      (dict_literal
        (pair_entry
          (bare_key
            (identifier))
          (string
            (double_quoted_string)))
        (pair_entry
          (bare_key
            (identifier))
          (number)))))
  (variable_declaration
    (binding_identifier
      (identifier))
    (pair_list_literal
      (pair_entry
        (bare_key
          (identifier))
        (string
          (double_quoted_string)))
      (pair_entry
        (bare_key
          (identifier))
        (number))
      (pair_entry
        (string
          (double_quoted_string))
        (number))
      (pair_entry
        (binary_expression
          (identifier)
          (identifier))
        (number))
      (pair_entry
        (parenthesized_expression
          (identifier))
        (number))))
  (variable_declaration
    (binding_identifier
      (identifier))
    (bag_literal
      (string
        (double_quoted_string))
      (string
        (double_quoted_string))
      (string
        (double_quoted_string))))
  (variable_declaration
    (binding_identifier
      (identifier))
    (set_literal
      (number)
      (number)
      (number)
      (set_close)))
  (variable_declaration
    (binding_identifier
      (identifier))
    (set_literal))
  (variable_declaration
    (binding_identifier
      (identifier))
    (call_expression
      (member_expression
        (dict_access_expression
          (index_expression
            (identifier)
            (number))
          (identifier))
        (identifier))
      (argument_list)))
  (variable_declaration
    (binding_identifier
      (identifier))
    (slice_expression
      (identifier)
      (number)
      (number)))
  (expression_statement
    (call_expression
      (member_expression
        (identifier)
        (identifier))
      (argument_list
        (pair_entry
          (bare_key
            (identifier))
          (string
            (double_quoted_string)))
        (pair_entry
          (bare_key
            (identifier))
          (number))
        (pair_entry
          (string
            (double_quoted_string))
          (number))
        (pair_entry
          (binary_expression
            (identifier)
            (identifier))
          (number))
        (pair_entry
          (parenthesized_expression
            (identifier))
          (number)))))
  (expression_statement
    (postfix_expression
      (identifier))))
