Алгоритм довольно прост, если вы можете вычислить автомат из вашего регулярного выражения.Как только у вас есть свой автомат.Например, для (aa*b|c)
автоматом будет (стрелки идут вправо):
a
/ \
a \ / b
-> 0 ---> 1 ---> 2 ->
\___________/
c
Затем просто «перечислите» свои переходы как правила.Ниже рассмотрим, что 0, 1 и 2 - нетерминальные символы, и, конечно, a, b и c - токены.
0: a1 | c2
1: a1 | b2
2: epsilon
или, если вы не хотите пустых правых частей.
0: a1 | c
1: a1 | b
И, конечно, маршрут в другом направлении предоставляет одно средство для преобразования регулярной грамматики в автомат, следовательно, рациональное выражение.