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 esquerdaO 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?AdicionadoFiz 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;} ;