Eliminar la recursión izquierda en ANTLR

Como se explica enEliminar la recursividad izquierda , hay dos formas de eliminar la recursividad izquierda.

Modifique la gramática original para eliminar la recursión izquierda utilizando algún procedimiento.Escriba la gramática originalmente para no tener la recursión izquierda

¿Qué utilizan normalmente las personas para eliminar (no tener) la recursión izquierda con ANTLR? He usado flex / bison para el analizador, pero necesito usar ANTLR. Lo único que me preocupa de usar ANTLR (o analizador LL en general) es la eliminación de recursividad.

En sentido práctico, ¿qué tan serio es eliminar la recursividad izquierda en ANTLR? ¿Es esto un showtopper en el uso de ANTLR? ¿O a nadie le importa en la comunidad ANTLR?Me gusta la idea de la generación AST de ANTLR. En términos de obtener AST de manera rápida y fácil, ¿qué método (de los 2 métodos de eliminación de recursión izquierda) es preferible?Adicional

Hice un experimento con la siguiente gramática.

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

Después de la eliminación de recursión izquierda, obtengo el siguiente

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

Podría proponer la siguiente representación de ANTLR. Aunque es relativamente simple y directo, parece que la gramática que no tiene la recursión izquierda debería ser la mejor opción.

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;} ;

Respuestas a la pregunta(4)

Su respuesta a la pregunta