Removendo a recursão esquerda no ANTLR

Como é explicado emRemovendo a recursão esquerda , existem duas maneiras de remover a recursão esquerda.

Modifique a gramática original para remover a recursão esquerda usando algum procedimentoEscreva a gramática originalmente para não ter a recursão esquerda

O que as pessoas normalmente usam para remover (sem ter) a recursão esquerda com o ANTLR? Eu usei flex / bison para analisador, mas preciso usar o ANTLR. A única coisa que me preocupa em usar o ANTLR (ou o analisador LL em geral) é a remoção da recursão esquerda.

No sentido prático, qual a gravidade da remoção da recursão esquerda no ANTLR? Isso é um impedimento no uso do ANTLR? Ou, ninguém se importa com isso na comunidade da ANTLR?Eu gosto da idéia da geração AST da ANTLR. Em termos de obter o AST de maneira rápida e fácil, qual método (dentre os 2 métodos de remoção da recursão esquerda) é preferível?Adicionado

Fiz um experimento com a seguinte gramática.

E -> E + T|T
T -> T * F|F
F -> INT | ( E )

Após a remoção da recursão esquerda, recebo o seguinte

E -> TE'
E' -> null | + TE'
T -> FT'
T' -> null | * FT'

Eu poderia criar a seguinte representação da ANTLR. Mesmo assim, é relativamente simples e direto, parece que a gramática que não tem a recursão à esquerda deve ser o melhor caminho a percorrer.

grammar T;

options {
    language=Python;
}

start returns [value]
   : e {$value = $e.value};
e returns [value]
   : t ep  
     {
       $value = $t.value
       if $ep.value != None:
         $value += $ep.value
     }
   ;
ep returns [value]
   : {$value = None}
   | '+' t r = ep 
     {
       $value = $t.value
       if $r.value != None:
            $value += $r.value
     }
   ;
t returns [value]
  : f tp 
    {
      $value = $f.value
      if $tp.value != None:
        $value *= $tp.value
    }
  ;
tp returns [value]
  : {$value = None}
  | '*' f r = tp 
    {
      $value = $f.value;
      if $r.value != None:
        $value *= $r.value
    }
  ;
f returns [int value]
  : INT {$value = int($INT.text)}
  | '(' e ')' {$value = $e.value}
  ;

INT :   '0'..'9'+ ;
WS: (' '|'\n'|'\r')+ {$channel=HIDDEN;} ;

questionAnswers(4)

yourAnswerToTheQuestion