У меня есть следующая грамматика, которая обрабатывает математические и логические выражения:
A ==> B A'
A' ==> | B A'
A' ==> epsilon
B ==> C B'
B' ==> ^ C B'
B' ==> epsilon
C ==> D C'
C' ==> & D C'
C' ==> epsilon
D ==> E D'
D' ==> << E D' | >> E D'
D' ==> epsilon
E ==> F E'
E' ==> + F E' | - F E'
E' ==> epsilon
F ==> G F'
F' ==> * G F' | / G F' | % G F'
F' ==> epsilon
G ==> +H | -H | ++H | --H | ~H | !H | &H
G ==> H
H ==> (A) | A T
T ==> -- | ++ | epsilon
H ==> number
Проблема возникает, когда происходит следующая деривация:
A ==> B ==> C ==> D ==> E ==> F ==> G ==> H ==> A
И JavaCC не будет компилировать файл грамматики из-за косвенной левой рекурсии.
Итак, какие шаги нужно сделать, чтобы устранить эту косвенную левую рекурсию из предыдущей грамматики?