Eu estava pesquisando sobre o conjunto de compiladores gcc na wikipedia aqui , quando isso surgiu:
O GCC começou usando os analisadores LALR gerados com o Bison, mas passou gradualmente para os analisadores escritos à mão; para C ++ em 2004 e para C e Objective-C em 2006. Atualmente, todos os front-ends usam analisadores de descida recursiva escritos à mão
Portanto, com a última frase (e pelo que confio na wikipedia), posso dizer definitivamente que "C (gcc), C ++ (g ++), Objective-C, Objective-C ++, Fortran (gfortran), Java (gcj), Ada (GNAT), Go (gccgo), Pascal (gpc), ... Mercúrio, Modula-2, Modula-3, PL / I, D (gdc) e VHDL (ghdl) "são todos front-ends que não use mais um gerador de analisador. Ou seja, todos eles usam analisadores escritos à mão.
Minha pergunta então é: essa prática é onipresente? Especificamente, estou procurando respostas exatas para "a implementação padrão / oficial de x possui um analisador escrito à mão" para x em [Python, Swift, Ruby, Java, Scala, ML, Haskell]? (Na verdade, informações em outros idiomas também são bem-vindas aqui.) Tenho certeza de que posso encontrar isso sozinho depois de muita pesquisa. Mas também tenho certeza de que isso é facilmente respondido pela comunidade. Obrigado!
Respostas:
O AFAIK, GCC usa analisadores escritos à mão, em particular, para melhorar o diagnóstico de erros sintáticos (ou seja, fornecer mensagens significativas humanas sobre erros de sintaxe).
A teoria de análise (e os geradores de análise descendentes dela) é principalmente sobre o reconhecimento e análise de uma frase de entrada correta . Mas esperamos dos compiladores que eles forneçam uma mensagem de erro significativa (e que sejam capazes de analisar significativamente o restante da entrada após o erro sintático), para alguma entrada incorreta.
Além disso, linguagens legadas antigas, como C11 ou C ++ 11- (que são conceitualmente antigas, mesmo que sua última revisão tenha apenas três anos) não são totalmente livres de contexto. Lidar com a sensibilidade desse contexto nas gramáticas para geradores de analisadores (ou seja, bisontes ou até menires ) é tediosamente difícil.
fonte
Dealing with that context sensitiveness in grammars for parser generators is boringly difficult
. Também é mais ou menos impossível, pois essas ferramentas geram analisadores sem contexto. O local correto para verificar se todas as restrições sensíveis ao contexto estão presentes é após a geração da árvore de análise, se você estiver usando ferramentas como esta.Os geradores e motores de analisador de analisadores são bastante gerais. A vantagem da generalidade é que é fácil construir um analisador preciso rapidamente e torná-lo funcional, no esquema geral das coisas.
O próprio mecanismo do analisador sofre na frente do desempenho devido à sua generalidade. Qualquer código escrito à mão sempre será significativamente mais rápido que os mecanismos do analisador acionado por tabela.
A segunda área em que os geradores / mecanismos de análise têm dificuldade é que todas as linguagens de programação reais são sensíveis ao contexto, geralmente de maneiras bastante sutis. As linguagens LR são livres de contexto, o que significa que existem muitas sutilezas sobre posicionamento e ambiente que são impossíveis de transmitir adequadamente na sintaxe. As gramáticas atribuídas tentam abordar regras básicas de linguagem, como "declarar antes do uso", etc. A conexão dessa sensibilidade ao contexto no código escrito à mão é simples.
fonte