texte source -> text objet (binaire translatable) -> texte machine ^ ^ | | Traducteur Edition des liens
Un symbole x quelconque ∈ Va est un improductif (inutile) s'il n'existe pas de dérivation de la forme suivante S =>+ α x Β =>* α ρ Β
x est un symbole inaccessible s'il n'apparaît dans aucune règle de L(G).
Une grammaire est dite réduite si elle n'a pas de symbole inaccessible ou improductif.
Une grammaire est ε-libre si elle n'a pas de règle epsilon de la forme A -> ε ou alors elle contient une seule règle S -> ε avec S qui n'apparaît jamais à droite d'une règle de production.
Une grammaire est dite sans-cycle s'il n'y a pas de dérivation de la forme A =>+ A.
Une grammaire est sous forme normale de Chomsky si ε appartient à la grammaire du langage, { S -> ε } ∈ P avec S qui n'apparaît pas à droite des règles.
La valeur d'un nombre est représentée par un quadruplet (M, s, x, n).
Autres notions
Supprimer la récursivité à droite ou à gauche consiste à trouver le langage généré et trouver une grammaire équivalente qui n'est pas récursive à droite ou à gauche.
Retour arrière : défaire des morceaux de l'abre et les reconstruire.
Ascendante : dérivation plus à droite descendante : dérivation la plus à gauche
Fonction d'analyse
fonction analyse(Notion : N) : booléen var : posloc, // Indice dans tab source trouve, // Booléen R, // La règle (alternant) courant E; // Le premier élément début posloc <- possource; // Variable globale R <- premiere regle; trouve <- faux; tant que non trouve et R != Vide faire si Essai(R) trouve <- vrai; sinon R <- suivant(R) fin fin retourner trouve fin
Fonction d'essai
fonction Essai(Règle R) : booléen début E <- premiere élément de R OK <- vrai tant que OK et E != Vide faire si E est 1 notion non terminale alors si analyse(E) alors E <- suivant(E) sinon OK <- faux fin sinon si (E = source[possource]) possource <- possource + 1; E <- suivant(E); fin fin retourner OK fin
Programme principal
programme principal début possource <- début du texte source; si analyse(Axiome) écrire("Le mot est reconnu") sinon écrire("Le mot n'est pas reconnu"); fin fin
Ces algorithmes n'acceptent que des grammaires récursives à gauche sous peine d'appels récursifs infinis.
Il faut une grammaire:
Pour chaque règle r, supprimer les méta-symboles qui se trouvent dans r puis :
Si r est de la forme r1r2 alors remplacer la règle A -> r par
A -> r1B B -> r2
Si r est sous la forme r1*r2 alors la remplacer la règle A -> r par
A -> r1B A -> r2 B -> r1B B -> r2
Supprimer les parenthèses par la distribution
a(b|c) -> ab | ac (b|c)a -> ba | ca
Une grammaire G est LL(1) si toutes ses règles sont LL(1)
Premier L1 ⊕ L2 =
Exemple :
L1 ⊕ L2 = {x, y} L3 ⊕ L2 = {x, y, a}
F0(A) = $ si A = S, ∅ sinon
Pour toutes les règles de la forme B -> ... A α avec α != ε
F1(A) = F0(A) ∪ (PREMIER(α) ∩ VT)
Pour toutes les règles de la forme B -> ... A α avec α = ε ou &espilon; ∈ PREMIER(α)
i <- 2; répéter Fi(A) = Fi-1(A) U Fi-1(B) jusqu'à Fi(A) = Fi-1(A) suivant(A) = Fi(A)
| Vt | $ | -+--------------+---+ | | | Vn | | | | | | -|--------------+---| | | | Vt | | | | | | -|--------------+ | $ | | -+------------------+
T(A, a) =
T(a, b) =
T($, $) = Succès
On construit la table et ensuite, on réalise l'analyse avec un triplet de piles initialisé à :
< chaîne d'entrée $, axiome $, ε >
Pour trouver les articles, par exemple, avec la règle E -> E + T, on a :
E -> . E + T E -> E . + T E -> E + . T E -> E + T .
La fermeture consiste à rajouter des articles à 1 état :
Pour une règle A -> α . B β, pout toutes les règles B -> γ, rajouter les articles B -> . γ
Pour construire les états
Remarques:
- Pour une transition, on utilise tous les articles ayant le même symbole à droite du point.
- Pour la fermeture, on reprend les mêmes articles même s'ils sont dans d'autres états.
- On ne construit pas un nouvel état avec un article présent autre part.