L'algorithme d'Earley est un algorithme non déterministe d'analyse syntaxique pour les grammaires non contextuelles. Il a été décrit pour la première fois par Jay Earley. Il se range, aux côtés des algorithmes CYK et GLR, parmi les algorithmes qui font usage de la notion de partage (de calculs et de structures) et qui construisent toutes les analyses possibles d'une phrase (et pas seulement une de ces analyses). Ce sont donc des algorithmes non-déterministes qui font usage d'idées venues du domaine de la programmation dynamique.
On peut construire un analyseur Earley pour toute grammaire non contextuelle. Il s'exécute en temps cubique (O(n3), où n est la longueur de la chaîne d'entrée, voire la taille du DAG d'entrée, l'algorithme pouvant aisément s'étendre à l'analyse de DAG). Pour une grammaire non ambiguë, l'analyse Earley s'effectue en temps quadratique (O(n2)).
Considérons une grammaire non contextuelle ainsi qu'une chaîne d'entrée de longueur n notée
L'algorithme d'Earley fait usage de ce que l'on appelle des items Earley, ou plus simplement des items. Un item est entièrement défini par une production de la grammaire, un entier i, appelé indice de début, tel que
Supposons que l'on soit à la j-ième étape (et donc à la position j de la chaîne d'entrée). Un item est dit j-valide (ou valide s'il n'y a pas d'ambiguïté) s'il représente une production dont on est en train d'essayer de faire dériver une sous-chaîne
On définit la table T[j] comme l'ensemble des items j-valides. Un item de la table T[j] est donc valide s'il représente une situation où l'on est à la j-ième étape (on a reconnu les j premiers symboles de la chaîne d'entrée, c'est-à-dire le préfixe
Supposons que S soit l'axiome de la grammaire. Les items de la forme
Le but de l'algorithme est donc de calculer en n + 1 étapes tous les items valides et seulement les items valides. La j-ième étape va donc être chargée de construire la table T[j] en construisant tous les items j-valides, et seulement ceux-ci.
Chacune des étapes exécute trois types d'opérations, nommées Lecture, Prédiction et Complétion (en anglais, respectivement Scanner, Predictor, Completor). À l'exception de l'étape 0, qui commence par la construction des items de départ comme dit ci-dessus (construction de la table T[0]), la j-ième étape commence par les opérations de Lecture. Le but de ces opérations est de faire avancer les points dans les items de la table précédente où le point est juste avant un terminal qui est précisément aj. Autrement dit, pour tout item de T[j − 1] de la forme
L'exécution d'une Prédiction ou d'une Complétion ajoute un item dans la table courante (la table T[j]). Ce nouvel item peut lui-même permettre de nouvelles Prédictions et de nouvelles Complétions. Celles-ci sont exécutées, et ainsi de suite jusqu'à ce que la table courante soit stable (et donc complète). Toutes ces opérations peuvent avoir pour effet de faire avancer le point dans des règles, si les non-terminaux que l'on franchit peuvent dériver dans le vide. Mais elles ne font pas avancer le point dans la chaîne d'entrée: on reste à la position j, et on ne remplit que la table T[j].
On peut se convaincre facilement (quitte à lire une preuve dans la littérature) que l'on ne construit ainsi que des items valides destinés à la table T[j], mais qu'on les construit tous.
Une fois que l'on ne peut plus construire de nouvel item pour la table T[j], on passe à l'étape j + 1. L'analyse réussit si on arrive de cette façon à exécuter les n étapes et si on obtient une table T[n] comprenant des items de la forme