Você nunca precisa de CNF. Ele tem a desvantagem de alterar a estrutura gramatical. Mas você precisa introduzir não terminais intermediários para que nenhum lado direito seja maior que 2 (formato 2), pois o comprimento do RHS determina a complexidade. A melhor tentativa de explicar intuitivamente é, se a memória serve, um artigo de Beau Shiel, "Observations on Context Free Parsing", publicado em 1976 em uma conferência lingüística computacional. O algoritmo de Earley usa 2 formas implicitamente. Está apenas oculto no algoritmo. Com relação à recuperação e manuseio da floresta de análise, você deve consultar a web em "analisando a floresta de interseção". Na verdade, é muito direto. Muitos artigos estão na Web, se você obtiver (de citações ou tabelas de conteúdo) os títulos ou autores para pesquisá-los diretamente.
Na verdade, você pode fazer muito mais que o CF e ainda obter florestas de análise em tempo polinomial. A questão é, às vezes: o que você pode fazer com isso depois de ter?
Um objetivo do último artigo mencionado é mostrar que algoritmos complexos (como GLR) não estão necessariamente comprando nada no tempo ou no espaço e podem alterar sua floresta de análise.
Uma observação sobre o ensino. Acho que Earley, seminal como era, é muito complicado para o ensino e pode ser substituído por algoritmos mais simples, com essencialmente o mesmo conteúdo educacional. Ensinar é sobre conceitos ou tecnologia. No algoritmo de Earley, os conceitos essenciais estão ocultos na complexidade dos detalhes e, do ponto de vista da tecnologia, estão desatualizados. Foi um ótimo artigo, mas não significa que seja a melhor abordagem pedagógica.
Pode haver mais informações na literatura de linguística computacional do que nos canais usuais de ciência da computação. Eu não tenho o livro de Ceriel-Grune-Jacobs, mas ficaria surpreso se eles não tivessem todas as referências apropriadas (embora eu não tenha certeza sobre seus critérios de seleção).
Complemento após uma solicitação em um comentário (7 de julho de 2013)
Esse complemento diz respeito à existência de algoritmos mais simples que os de Earley.
Como eu disse, pesquisar na web em "analisar floresta de interseção" deve fornecer rapidamente referências, das quais você pode ir além.
A idéia básica é que todos os caminhos que analisam a construção de uma floresta compartilhada nada mais são do que a antiga construção de interseção de Bar Hillel, Perles e Shamir para uma linguagem regular e uma linguagem livre de contexto, usando um autômato finito e uma gramática livre de contexto. Dada a gramática CF, você aplica a construção a um autômato trivial que reconhece apenas sua sequência de entrada. Isso é tudo. A floresta compartilhada é apenas a gramática da interseção. Está relacionado à gramática original através de um homomorfismo, reconhece apenas a sequência especificada, mas com todas as árvores de análise da gramática original até esse homomorfismo (isto é, renomeação simples de não terminais).
A gramática resultante contém muitas coisas inúteis, não terminais e regras, inacessíveis ao axioma (que não podem ser encontradas em uma sequência derivada do símbolo inicial) ou que não são produtivas (não podem ser derivadas em um terminal corda).
Então, você precisa limpá-lo com uma boa escova no final (possivelmente longa, mas algoritmicamente simples), ou pode tentar melhorar a construção para que haja menos cotão inútil a ser escovado no final.
Por exemplo, a construção do CYK é exatamente isso, mas organizada para que todas as regras e não terminais criados sejam produtivos, embora muitos possam ser inacessíveis. Isso é de se esperar de uma técnica de baixo para cima.
Técnicas de cima para baixo (como as baseadas em LR (k)) evitarão regras inacessíveis e não terminais, mas criarão improdutivas.
Muito da escovação pode ser alcançada com o uso adequado de ponteiros, eu acho, mas não vejo isso há muito tempo.
Todos os algoritmos existentes realmente seguem essencialmente esse modelo. Então esse é realmente o cerne da questão, e é muito simples. Então, por que enterrá-lo em complexidade?
Muitas "otimizações" são propostas na literatura, muitas vezes baseadas na família de construção de analisadores LR (k), LL (k), possivelmente com algum fatoramento estático dessas construções (Earley não possui fatoramento estático). Na verdade, poderia ser aplicado a todas as técnicas conhecidas, incluindo os antigos analisadores de precedência. Coloquei "otimização" entre aspas, porque geralmente não está claro o que você está otimizando, ou mesmo se você está realmente otimizando ou se o benefício da melhoria vale a complexidade adicional do seu analisador. Você encontrará poucos dados objetivos, formais ou experimentais, sobre isso (há alguns), mas muitas outras reivindicações. Não estou dizendo que não há nada de interessante. Existem algumas idéias inteligentes.
Agora, depois de conhecer a idéia básica, as "otimizações" ou melhorias podem ser introduzidas estaticamente (possivelmente incrementalmente) construindo um autômato push-down a partir da gramática, seguindo o tipo de técnica de construção do analisador em que você está interessado e aplicando a construção de produtos cruzados para interseção com esse autômato (quase o mesmo que fazer com a gramática) ou com uma gramática derivada desse autômato.
Então você pode introduzir sinos e assobios, mas isso é principalmente detalhes tecnológicos.
O Philosophiæ Naturalis Principia Mathematica de Isaac Newton é declaradamente uma grande peça de física e matemática. Eu não acho que esteja na lista de leitura de muitos estudantes. Todas as outras coisas são iguais, não acho que seja muito útil ensinar o algoritmo de Earley, embora seja uma peça histórica importante. Os alunos têm o suficiente para aprender como é. Correndo o risco de ser derrubado por muitas pessoas, penso o mesmo no artigo de Knuth LR (k). É uma excelente peça de análise teórica e provavelmente uma leitura importante para um teórico. Duvido fortemente que seja tão essencial para a construção de analisadores, dado o estado atual da tecnologia, tanto de hardware quanto de software. Os tempos são passados em que a análise era uma parte significativa do tempo de compilação, ou quando a velocidade dos compiladores era um problema crítico (eu conhecia uma empresa que morreu de custos de compilação há cerca de 30 anos). O especialista em análise pode querer aprender que o conhecimento especializado em algum momento, mas o estudante médio em ciência da computação, programação ou engenharia não precisa dele.
Se os alunos precisam dedicar mais tempo à análise, existem outras extensões que podem ser mais úteis e formativas, como as usadas na lingüística computacional. O primeiro papel do ensino é extrair as idéias simples que estruturam o conhecimento científico, não forçar os alunos a sofrer o que os cientistas da pesquisa sofreram (exceto os alunos de doutorado: é um rito de passagem :-).
Licença CC BY-SA 3.0 do autor