# define primitive fields
int, cc, tok, str, csymbl

regex = Not(regex arg)
    | NotCC(regex arg)
    | Star(regex arg)
    | Optional(regex arg)
    | Concat(regex left, regex right)
    | Or(regex left, regex right)
    | And(regex left, regex right)
    | StartWith(regex arg)
    | EndWith(regex arg)
    | Contain(regex arg)
    | Repeat(regex arg, int k)
    | RepeatAtleast(regex arg, int k)
    | RepeatRange(regex arg, int k1, int k2)
    | CharClass(cc arg)
    | Token(tok arg) #  <x> single token
    | ConstSym(csymbl arg) # const0 const1
    | String(str arg)  # string const(<str>)