=============|||
Step Expression Or Stuttering
=============|||

---- MODULE Test ----
op == [A]_<<x, y, z>>
====

--------------|||

(source_file (module (header_line) (identifier) (header_line)
  (operator_definition (identifier) (def_eq)
    (step_expr_or_stutter
      (identifier_ref)
      (tuple_literal (langle_bracket) (identifier_ref) (identifier_ref) (identifier_ref) (rangle_bracket))
    )
  )
(double_line)))

=============|||
Step Expression No Stuttering
=============|||

---- MODULE Test ----
op == <<A>>_<<x, y, z>>
====

--------------|||

(source_file (module (header_line) (identifier) (header_line)
  (operator_definition (identifier) (def_eq)
    (step_expr_no_stutter
      (langle_bracket)
      (identifier_ref)
      (rangle_bracket_sub)
      (tuple_literal (langle_bracket) (identifier_ref) (identifier_ref) (identifier_ref) (rangle_bracket))
    )
  )
(double_line)))

=============|||
Step Expression With Parameterized Subscript
=============|||

---- MODULE Test ----
op == [A]_M(S)!vars
====

--------------|||

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq) definition:
    (step_expr_or_stutter
      (identifier_ref)
      (prefixed_op
        prefix: (subexpr_prefix (subexpr_component
          (bound_op name: (identifier_ref) parameter: (identifier_ref))
        ))
        op: (identifier_ref)
      )
    )
  )
(double_line)))

=============|||
Step Expressions with Jlist
=============|||

---- MODULE Test ----

op == [
  /\ 1
  /\ 2
    ]_x

op == <<
  /\ 1
  /\ 2
    >>_x

====

--------------|||

(source_file (module (header_line) (identifier) (header_line)
  (operator_definition (identifier) (def_eq)
    (step_expr_or_stutter
      (conj_list (conj_item (bullet_conj) (nat_number)) (conj_item (bullet_conj) (nat_number)))
      (identifier_ref)
    )
  )
  (operator_definition (identifier) (def_eq)
    (step_expr_no_stutter
      (langle_bracket)
      (conj_list (conj_item (bullet_conj) (nat_number)) (conj_item (bullet_conj) (nat_number)))
      (rangle_bracket_sub)
      (identifier_ref)
    )
  )
(double_line)))

=============|||
Various Valid Step Expressions
=============|||

---- MODULE Test ----
Prop == [][x = {1, 2}]_x
Prop == [][1 \in {1, 2}]_x
Prop == [][LET S == {1, 2} IN x \in S]_x
Prop == [][LET S == {1, 2} IN x \in {1, 2}]_x
Prop == [][TRUE /\ x \in {1, 2}]_x
====

--------------|||

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq) definition:
    (bound_prefix_op symbol: (always) rhs: (step_expr_or_stutter
      (bound_infix_op
        lhs: (identifier_ref)
        symbol: (eq)
        rhs: (finite_set_literal (nat_number) (nat_number))
      )
      (identifier_ref)
    ))
  )
  (operator_definition name: (identifier) (def_eq) definition:
    (bound_prefix_op symbol: (always) rhs: (step_expr_or_stutter
      (bound_infix_op
        lhs: (nat_number)
        symbol: (in)
        rhs: (finite_set_literal (nat_number) (nat_number))
      )
      (identifier_ref)
    ))
  )
  (operator_definition name: (identifier) (def_eq) definition:
    (bound_prefix_op symbol: (always) rhs: (step_expr_or_stutter
      (let_in
        definitions:
          (operator_definition
            name: (identifier) (def_eq)
            definition: (finite_set_literal (nat_number) (nat_number))
          )
        expression: (bound_infix_op lhs: (identifier_ref) symbol: (in) rhs: (identifier_ref))
      )
      (identifier_ref)
    ))
  )
  (operator_definition name: (identifier) (def_eq) definition:
    (bound_prefix_op symbol: (always) rhs: (step_expr_or_stutter
      (let_in
        definitions:
          (operator_definition
            name: (identifier) (def_eq)
            definition: (finite_set_literal (nat_number) (nat_number))
          )
        expression:
          (bound_infix_op
            lhs: (identifier_ref)
            symbol: (in)
            rhs: (finite_set_literal (nat_number) (nat_number))
          )
      )
      (identifier_ref)
    ))
  )
  (operator_definition name: (identifier) (def_eq) definition:
    (bound_prefix_op symbol: (always) rhs: (step_expr_or_stutter
      (bound_infix_op lhs: (boolean) symbol: (land) rhs:
        (bound_infix_op
          lhs: (identifier_ref)
          symbol: (in)
          rhs: (finite_set_literal (nat_number) (nat_number))
        )
      )
      (identifier_ref)
    ))
  )
(double_line)))

=============|||
Step Expression Requiring Lookahead
=============|||

---- MODULE Test ----
Prop == [][x \in {1, 2}]_x
====

--------------|||

(source_file (module (header_line) name: (identifier) (header_line)
  (operator_definition name: (identifier) (def_eq) definition:
    (bound_prefix_op symbol: (always) rhs: (step_expr_or_stutter
      (bound_infix_op
        lhs: (identifier_ref)
        symbol: (in)
        rhs: (finite_set_literal (nat_number) (nat_number))
      )
      (identifier_ref)
    ))
  )
(double_line)))
