--- title: ING1 - THL tags: EPITA --- # Théorie des Langages - S5 ## Alphabets Langage : Ensemble de mot (infini ou pas, peut être vide) Mot : Suite (=> Ordre important != Ensemble) finie de symbole, peut être vide Alphabet : Ensemble de symbole fini et non vide ![](https://i.imgur.com/Xb7XQSC.png) $\sum = \{a, b\}$ (alphabet) $\sum^{★} = \{\epsilon, a, b, aa, ab, ba, bb, aaa,...\}$ $L^{+} = L.L^{★}$ : Ici $L^{+}$ ne contient $\epsilon$ si $L$ le contient quand $L^{★}$ le contient tout le temps $\forall u \in \sum^{★}$, u est un mot $\forall L \subset \sum^{★}$, L est un langage Langage vide : Element absorbant Langage $\{\epsilon\}$ : Element neutre ### Opérations sur les langages - Union : $L_{1} \cup L_{2}$ ou $L_{1} + L_{2}$ : Opération associative et commutative - Intersection : $L_{1} \cap L_{2}$ : Opération associative et commutative - Concaténation : $L_{1}.L_{2}$ : Opération associative et non-commutative - Auto-concaténation : $L^{n} = L.L.L.L~(n~fois)$ et $L^{0} = \{\epsilon\}$ - Fermeture de Kleene : $L^{★}$ : Tous les mots que on peut former avec le langage L - $∅^{★} = \{\epsilon\}$ - Complémentation : $\overline{L}$ - Préfixe : $Pref(L)$ : Préfixe d'un mot (le préfixe peut être le mot en entier) - Ajouter des entrées sur les états co-accessible - Préserve la rationnalité - Suffixe : $Suff(L)$ : Suffixe d'un mot (le suffixe peut être le mot en entier) - Ajouter des entrées sur les états accessible - Ne préserve pas forcément la rationnalité - Sous-mot : $Sous-mot(L)$ : - Ajout d'entrées et de sorties sur les états utiles ### Rationnalité Soit $\sum$ un alphabet - $\{\epsilon\}$ et $∅$ sont des langages rationnels - $\forall a \in \sum, \{a\}$ est un langage rationnel - Si $L_{1}$ et $L_{2}$ sont des langages rationnels, alors sont rationnels: - $L_{1} \cup L_{2}$ ou $L_{1} + L_{2}$ - $L_{1}.L_{2}$ - $L_{1}^{★}$ Les opérations d'union ($\cup$ | $+$), de concaténation ($.$) et de l'étoile ($★$) sont rationnelles. Les opérations la complémentation ($\overline{L}$) et l'intersection ($\cap$) ne sont pas rationnelles. Une partie d'un langage rationnel n'est pas forcément rationnelle ($a^{n}b^{n}$ n'est pas rationnel) ### Expressions rationnelles ![](https://i.imgur.com/d2EUvf4.png) ## Automates finis - NFA : Automate fini non-déterministe (possibilité présence de liaison spontanées $\epsilon$) - Compléxité : exponentielle ![](https://i.imgur.com/FHapAq6.png) - DFA : Automate fini déterministe (pas de liaisons spontanées $\epsilon$) - Complexité : linéaire ![](https://i.imgur.com/1l3POou.png) Si un mot ne se finit pas par un état possédant une sortie, alors il ne respecte pas la regex détectée par l'automate - $(\sum, Q, I, F, \delta)$ où : - $\sum$ : Alphabet de travail - $Q$ : Ensemble d'états - $I \subset Q$ : Ensemble d'états initiaux - $F \subset Q$ : Ensemble d'états finaux - $\delta$ : Ensemble de transition - Un état **utile** : accessible ET co-accessible - Transition - Langage supportes - Problèmes et limitations - Thompson ### Automate de Thomson (NFA) | Opération / Ensemble | Représentation | | ------------------------------- | ------------------------------------ | | ∅ $\to$ ∅ | ![](https://i.imgur.com/vhoPbzB.png) | | $\{\epsilon\} \to \epsilon$ | ![](https://i.imgur.com/dP0vfZk.png) | | $\forall a \in \{a\} \to a$ | ![](https://i.imgur.com/cKsutZD.png) | | Concaténation $L_{1}.L_{2}$ | ![](https://i.imgur.com/UQaVTjC.png) | | Union $L_{1} \cup L_{2}$ | ![](https://i.imgur.com/oMYEsSJ.png) | | Etoile $L_{1}^{★}$ | ![](https://i.imgur.com/Osw6ijP.png) | ### Déterminisation Pour tout les automates NFA ont peut construire un équivalent DFA. Si l'automate NFA possède $N$ états, alors l'automate DFA résultat à au plus $2^{N}$ états Exemple : ![](https://i.imgur.com/s5a5m12.png) ## Grammaire et contexte Grammaire : Soit $\{a, b\}$ deux terminaux et $S$ un non-terminal. $S \to aSb$ $S \to \epsilon$ ### Hiérarchie de Chomsky ![](https://i.imgur.com/BbcikPq.png) - Grammaire monotone : $\alpha \to \beta \Rightarrow |\alpha| \leq |\beta|$ Pour éviter que la règle ne consomme des caractères. - Contexte-Sensitive : ![](https://i.imgur.com/siMC2fF.png) Réécrire que la partie non-terminale - Contexte free : $X \to \alpha$ Ici $X$ (symbole non-terminal) est remplacé par $\alpha$ (symbole terminal ou non-terminal). On ne regarde pas le contexte avant de le remplacer. - Grammaire régulière : - Linéaire à droite : $A \to u \overrightarrow{B}$ L'élement non-terminal est situé à la fin du mot. - Linéaire à gauche : $A \to \overrightarrow{B}u$ L'élement non-terminal est situé au début du mot. Il existe un automate déterministe qui reconnaisse son langage - Linéaire à droite et à gauche : Peuvent engendrer des langages rationnels si on accepte la production $A \to \epsilon$ - Grammaire à choix finis : $A \to u$ où $A \subset N$ et $u \in \sum^{+}$ Engendre uniquement des langages finis qui ne contiennent pas le mot vide. ### Parseurs LL et LR ![](https://i.imgur.com/hMPf8hG.png) Parser LL : Manque d'expressivité Parser LR : Plus compliqué à écrire à la main Lex/Flex : Analyseur lexical Yacc : Analyseur syntaxique LALR(1) Précision et complexité LR(0) < LALR(1) < SLR(1) < LR(1) (tableau) - LL(k) - LR(k) - CLR(k) : Complex LR(k) - SLR(k) : Simple LR(k) - LALR(k) : LookAhead LR(k) (Parser Yacc) : Langage Type <= 2 - Fusionne les états au LookAhead près par rapport à un LR(k) - Follow - Lookhead