===================
sequence match
===================
hello
---

(pattern (term
  (pattern_character)
  (pattern_character)
  (pattern_character)
  (pattern_character)
  (pattern_character)
))

===================
sequence match w/ '.' atom
===================
he..o
---

(pattern (term
  (pattern_character)
  (pattern_character)
  (any_character)
  (any_character)
  (pattern_character)
))

===================
quantifiers
===================
h*?e*l+.?
---

(pattern (term
  (pattern_character)
    (zero_or_more (lazy))
  (pattern_character)
    (zero_or_more)
  (pattern_character)
    (one_or_more)
  (any_character)
    (optional)
))


===================
quantifiers - count
===================
h{1,2}?el{1,2}.{3}
---

(pattern (term
  (pattern_character)
  (count_quantifier (decimal_digits) (decimal_digits) (lazy))
  (pattern_character)
  (pattern_character)
  (count_quantifier (decimal_digits) (decimal_digits))
  (any_character)
  (count_quantifier (decimal_digits))
))

===================
disjunctions
===================
he..o|wo.ld
---

(pattern (disjunction
  (term
    (pattern_character)
    (pattern_character)
    (any_character)
    (any_character)
    (pattern_character)
  )
  (term
    (pattern_character)
    (pattern_character)
    (any_character)
    (pattern_character)
    (pattern_character)
  )
))

===================
disjunctions with empty terms
===================
||he..o||wo.ld|||
---

(pattern (disjunction
  (term
    (pattern_character)
    (pattern_character)
    (any_character)
    (any_character)
    (pattern_character)
  )
  (term
    (pattern_character)
    (pattern_character)
    (any_character)
    (pattern_character)
    (pattern_character)
  )
))

===================
assertions - line start / end
===================
^he..o$
---

(pattern (term
  (start_assertion)
  (pattern_character)
  (pattern_character)
  (any_character)
  (any_character)
  (pattern_character)
  (end_assertion)
))

===================
assertions - word boundary
===================
\Bhe..o\b
---

(pattern (term
  (non_boundary_assertion)
  (pattern_character)
  (pattern_character)
  (any_character)
  (any_character)
  (pattern_character)
  (boundary_assertion)
))


===================
disjunction w empty terms & assertions
===================
^he..o$||w..ld$
---

(pattern (disjunction
  (term
    (start_assertion)
    (pattern_character)
    (pattern_character)
    (any_character)
    (any_character)
    (pattern_character)
    (end_assertion))
  (term
    (pattern_character)
    (any_character)
    (any_character)
    (pattern_character)
    (pattern_character)
    (end_assertion))
))

===================
lookahead
===================
Jack(?=Sprat)
---

(pattern (term
    (pattern_character)
    (pattern_character)
    (pattern_character)
    (pattern_character)
    (lookahead_assertion (pattern (term
      (pattern_character)
      (pattern_character)
      (pattern_character)
      (pattern_character)
      (pattern_character)
    )))
))

===================
character classes
===================
[A-Za-z][^Xx]
---

(pattern (term
  (character_class
    (class_range (class_character) (class_character))
    (class_range (class_character) (class_character))
  )
  (character_class
    (class_character)
    (class_character)
  )
))

===================
character classes - '-' is an atom
===================
[-]
---
(pattern (term
  (character_class
    (class_character)
  )
))

===================
character classes - /[---]/ is odd but valid
===================
[---]
---
(pattern (term
  (character_class
    (class_range (class_character) (class_character))
  )
))

===================
character classes - identity escapes
===================
[\-\.]
---
(pattern (term
  (character_class
    (identity_escape)
    (identity_escape)
  )
))

===================
identity escapes
===================
\a\b\c\d\\\{\(\[\]\)\}
---

(pattern (term
  (identity_escape)
  (boundary_assertion)
  (identity_escape)
  (character_class_escape)
  (identity_escape)
  (identity_escape)
  (identity_escape)
  (identity_escape)
  (identity_escape)
  (identity_escape)
  (identity_escape)))

===================
non-capturing groups
===================
Jack(?:Sprat)
---

(pattern (term
  (pattern_character)
  (pattern_character)
  (pattern_character)
  (pattern_character)
  (non_capturing_group (pattern (term
    (pattern_character)
    (pattern_character)
    (pattern_character)
    (pattern_character)
    (pattern_character)
  )))
))

===================
atom escapes - character class escapes
===================
\S\w\cZ
---

(pattern (term
  (character_class_escape)
  (character_class_escape)
  (control_letter_escape)
))

===================
atom escapes - control escapes
===================
\f\n\r\t\v\0
---

(pattern (term
  (control_escape)
  (control_escape)
  (control_escape)
  (control_escape)
  (control_escape)
  (control_escape)
))

===================
atom escapes - decimal escapes
===================
\8230
---

(pattern (term
  (decimal_escape)
))

===================
atom escapes - unicode property value expressions
===================
\p{General_Category=Decimal_Number}
---

(pattern (term
  (character_class_escape
    (unicode_property_value_expression
      (unicode_property_name)
      (unicode_property_value)
    )
  )
))

===================
atom escapes - lone unicode property names
===================
\p{Decimal_Number}
---

(pattern (term
  (character_class_escape
    (unicode_property_value_expression
      (unicode_property_value)
    )
  )
))

===================
capturing groups
===================
hello (.*)
---

(pattern (term
  (pattern_character)
  (pattern_character)
  (pattern_character)
  (pattern_character)
  (pattern_character)
  (pattern_character)
  (anonymous_capturing_group
    (pattern (term
      (any_character) (zero_or_more)
    ))
  )
))


===================
named capturing groups
===================
(?<world>.*)
---

(pattern (term
  (named_capturing_group
    (group_name)
    (pattern (term
      (any_character) (zero_or_more)
    ))
  )
))

===================
named capturing groups - backreferences
===================
(?<world>.*)\kworld
---

(pattern (term
  (named_capturing_group
    (group_name)
    (pattern (term
      (any_character) (zero_or_more)
    ))
  )
  (backreference_escape (group_name))
))


===================
a date regex
===================
(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})
---
(pattern (term
  (named_capturing_group (group_name) (pattern (term
    (character_class (class_range (class_character) (class_character)))
    (count_quantifier (decimal_digits))
  )))
  (pattern_character)
  (named_capturing_group (group_name) (pattern (term
    (character_class (class_range (class_character) (class_character)))
    (count_quantifier (decimal_digits))
  )))
  (pattern_character)
  (named_capturing_group (group_name) (pattern (term
    (character_class (class_range (class_character) (class_character)))
    (count_quantifier (decimal_digits))
  )))
))

===================
a multiline url regex
===================
[-a-zA-Z0-9@:%._\+~#=]{2,256}
\.[a-z]{2,6}\b(
[-a-zA-Z0-9@:%_\+.~#?&//=]*
)
---

(pattern (term
  (character_class
    (class_character)
    (class_range (class_character) (class_character))
    (class_range (class_character) (class_character))
    (class_range (class_character) (class_character))
    (class_character)
    (class_character)
    (class_character)
    (class_character)
    (class_character)
    (identity_escape)
    (class_character)
    (class_character)
    (class_character)
  )
  (count_quantifier (decimal_digits) (decimal_digits))
  (identity_escape)
  (character_class (class_range (class_character) (class_character)))
  (count_quantifier (decimal_digits) (decimal_digits))
  (boundary_assertion)
  (anonymous_capturing_group (pattern (term
    (character_class
      (class_character)
      (class_range (class_character) (class_character))
      (class_range (class_character) (class_character))
      (class_range (class_character) (class_character))
      (class_character)
      (class_character)
      (class_character)
      (class_character)
      (identity_escape)
      (class_character)
      (class_character)
      (class_character)
      (class_character)
      (class_character)
      (class_character)
      (class_character)
      (class_character)
    )
    (zero_or_more)
  )))
))

================================
Curly braces as pattern chars
================================
{ab{ab
---

(pattern (term
  (pattern_character)
  (pattern_character)
  (pattern_character)
  (pattern_character)
  (pattern_character)
  (pattern_character)))
