Так как в исходной грамматике синтаксиса присутствовала левая рекурсия, что осложняло чтение, парсер был написан написан по следующей грамматике:
<regex> ::= <term> '|' <regex> | <term>
<term> ::= <factor> | <factor><factor> | <factor> '#' <factor>
<factor> ::= <base> | <base> '*' | <base> '+'
<base> ::= <char> | '(' <regex> ')'
P.S.оригинал: https://matt.might.net/articles/parsing-regex-with-recursive-descent/
Могут быть неточности в изложении мысли формальной записью
Парсер написан по методу Александра Владимировича (ваши замечания по коду на конференции я слышал, но до реализации руки не дошли). Да и мой парсер, похоже, получился далеким от "чистого"...
https://groups.google.com/g/metacomputation-ru/c/mFlLMjYNSLg