Grammaire formelle
Une grammaire formelle est un ensemble de règles permettant de générer tous les mots (ou chaînes) valides d'un langage donné. Elle est définie comme un quadruplet $G = (V, \Sigma, P, S)$, où :
- $V$ est un ensemble fini de symboles non terminaux (ou variables) ;
- $\Sigma$ est un ensemble fini de symboles terminaux, disjoints de $V$, représentant les éléments du langage ;
- $P$ est un ensemble fini de règles de production de la forme $A \to \gamma$, où $A \in V$ et $\gamma \in (V \cup \Sigma)^*$ ;
- $S$ sert de symbole de départ ($S \in V$).
Grammaire non contextuelle
Une grammaire est dite non contextuelle si toutes ses règles de production respectent la forme $A \to \gamma$ où :
- $A \in V$ est un unique terme non-terminal, à gauche de la règle ;
- $\gamma \in (V \cup \Sigma)^*$ est une combinaison quelconque de terminaux et non-terminaux, à droite de la règle de production.
Le langage engendré par une grammaire non contextuelle est l'ensemble des mots pouvant être formés uniquement de symboles terminaux, et qui peuvent être dérivées à partir du symbole initial S en appliquant les règles de production.
Langage de programmation
Les grammaires non contextuelles sont fondamentales pour les langages de programmation, car elles permettent d'analyser les structures syntaxiques complexes des programmes (par exemple, les expressions arithmétiques imbriquées, les blocs de code, etc.).
Grammaire contextuelle
Les grammaires non contextuelles tirent leur nom du fait que les règles de production ne dépendent pas du contexte dans lequel apparaît le symbole à remplacer : cela correspond au fait que symbole à gauche de la règle de production est seul, donc sans contexte.
Cela les différencie des grammaires dites contextuelles ou le symbole de gauche doit être contextualisé, avec d'autres symboles qui peuvent l'accompagner, dans les règles de production.