####################### # Original LR grammar # ####################### S -> <^> R <$> R -> R|R -> R+ -> R? -> R* -> R R -> R{num<,>} -> R{<,num>} -> (R) -> bracket -> rchar bracket -> [<^> *] bchar -> any character but [ or - -> \] -> \- -> \^ -> \\ range -> bchar - bchar class -> [:alpha:] / [:digit:] / ... et cetera rchar -> any character but ( ) [ ] { } * ? + -> \ char char -> any character ################# # Left-factored # ################# R -> T # regex is a single term -> T R # a term followed by a regex -> T | R # a term or regex -> # empty T -> F # a regex term is a factor -> F * -> F ? -> F + -> F {num<,>} F -> rchar # a factor is a regex char -> bracket # [...] expression -> (R) # parenthesized regex bracket -> [<^> *] bchar -> any character but [ or - -> \] -> \- -> \^ -> \\ range -> bchar - bchar class -> [:alpha:] / [:digit:] / ... et cetera rchar -> any character but ( ) [ ] { } * ? + -> \ char char -> any character