==============================
Value definition
==============================

let x = y
let ( + ) = x
let rec x = y and y = x
let x, y = y, x
let x : 'a . 'a t = y
let f ~x ~l:y ~(x : t) ?(l = y) ?l:((x, y) : t = xy) = x
let f (type t) x : t = x
let+ x = a and+ y = b
let%ext x
let* x and* y

---

(compilation_unit
  (value_definition
    (let_binding
      pattern: (value_name)
      body: (value_path
        (value_name))))
  (value_definition
    (let_binding
      pattern: (parenthesized_operator
        (add_operator))
      body: (value_path
        (value_name))))
  (value_definition
    (let_binding
      pattern: (value_name)
      body: (value_path
        (value_name)))
    (let_binding
      pattern: (value_name)
      body: (value_path
        (value_name))))
  (value_definition
    (let_binding
      pattern: (tuple_pattern
        (value_name)
        (value_name))
      body: (tuple_expression
        (value_path
          (value_name))
        (value_path
          (value_name)))))
  (value_definition
    (let_binding
      pattern: (value_name)
      type: (polymorphic_type
        (type_variable)
        type: (constructed_type
          (type_variable)
          (type_constructor_path
            (type_constructor))))
      body: (value_path
        (value_name))))
  (value_definition
    (let_binding
      pattern: (value_name)
      (parameter
        pattern: (value_pattern))
      (parameter
        (label_name)
        pattern: (value_pattern))
      (parameter
        pattern: (value_pattern)
        type: (type_constructor_path
          (type_constructor)))
      (parameter
        pattern: (value_pattern)
        default: (value_path
          (value_name)))
      (parameter
        (label_name)
        pattern: (parenthesized_pattern
          (tuple_pattern
            (value_pattern)
            (value_pattern)))
        type: (type_constructor_path
          (type_constructor))
        default: (value_path
          (value_name)))
      body: (value_path
        (value_name))))
  (value_definition
    (let_binding
      pattern: (value_name)
      (abstract_type
        (type_constructor))
      (parameter
        pattern: (value_pattern))
      type: (type_constructor_path
        (type_constructor))
      body: (value_path
        (value_name))))
  (value_definition
    (let_operator)
    (let_binding
      pattern: (value_name)
      body: (value_path
        (value_name)))
    (let_and_operator)
    (let_binding
      pattern: (value_name)
      body: (value_path
        (value_name))))
  (value_definition
    (attribute_id)
    (let_binding
      pattern: (value_name)))
  (value_definition
    (let_operator)
    (let_binding
      pattern: (value_name))
    (let_and_operator)
    (let_binding
      pattern: (value_name))))

==============================
Include
==============================

include M
include M.M
include M.M.M
include M(M)

---

(compilation_unit
  (include_module
    module: (module_path
      (module_name)))
  (include_module
    module: (module_path
      (module_path
        (module_name))
      (module_name)))
  (include_module
    module: (module_path
      (module_path
        (module_path
          (module_name))
        (module_name))
      (module_name)))
  (include_module
    module: (module_application
      functor: (module_path
        (module_name))
      argument: (parenthesized_module_expression
        (module_path
          (module_name))))))
