Regex : Alternation

Alternation : AtomicOps Alternation'

Alternation' : '|' AtomicOps Alternation'
             | e

AtomicOps : AtomicOp AtomicOps
          | e

AtomicOp : Atomic
         | Atomic Op

Atomic : Concat
       | Group

Op : '+'
   | '*'
   | '?'

Group : '(' Alternation ')'

Concat : Char Concat
       | e

Char : CHAR
     | CharRange

CharRange : '[' RangeInner ']'
          | '[' '^' RangeInner ']'

RangeInner : RangeComponent RangeInner
           | e

RangeComponent : CHAR
               | CHAR '-' CHAR
