Итак, после того, как я полчаса смотрел на эту грамматику, я понял, что в особом случае:
H ==> A
И тот же особый случай дает:
A ==> H
Итакя перефразировал грамматику таким образом, что первое производственное правило для нетерминала H
вызывает левую рекурсию, а второе производственное правило не вызывает никакой левой рекурсии, поэтому вот как выглядит грамматика:
H ==> A T
T ==> -- | ++ | epsilon
H ==> (A) | number
Как уже было сказано, мы заменяем A
на H
в первом производственном правиле:
H ==> H T
H ==> (A) | number
T ==> -- | ++ | epsilon
Теперь тривиально устранить левую рекурсию, и вот как выглядит финальная грамматика:
H ==> (A)H' | number H'
H' ==> T H' | epsilon
T ==> -- | ++ | epsilon