# Grammaire indexée

Une grammaire indexée est une généralisation d'une grammaire non contextuelle où les symboles non terminaux sont munis de listes d'indicateurs ou symboles d'index (aussi appelés « flags » en anglais}. Le langage engendré par une grammaire indexée est appelé un langage indexé. Les grammaires indexées sont plus puissantes que les grammaires algébriques, et moins générales que les grammaires contextuelles. Elles sont en revanche équivalentes à d'autres familles de grammaires génératives, comme les grammaires d'arbre adjoints.

## Définition

Une grammaire indexée se définit comme une grammaire algébrique, avec en plus des symboles spéciaux appelés indices, ou index, ou « flags » (indicateurs). Ces symboles supplémentaires servent à mémoriser l'application des règles dans le mot engendré, et d'obtenir par là-même un certain degré de parallélisme. Voici la définition formelle :
Une grammaire indexée est une structure G = ⟨N,T,F,P,S⟩, où
* N est l'ensemble des symboles non-terminaux ou variables
* T est un alphabet composé de symboles terminaux,
* F est un ensemble de symboles d'index ou d'indices,
* S ∈ N est l'axiome, et
* P est un ensemble fini de règles de production.
Chaque occurrence d'une variable de la grammaire, dans une production ou dans une dérivation, est munie d'une suite $\sigma \in F^{*}$ de symboles d'index, appelée une « pile d'index». L'occurrence d'une pile d'index $\sigma$ attaché à une variable $A$ est notée
    $A[\sigma ]$,
où les crochets ne font pas partie de l’alphabet. Les symboles terminaux ne sont pas dotés de piles.
On étend cette notation aux mots composés de symboles terminaux ou non-terminaux, en notant, pour une pile d'index $\sigma$ et un mot $\alpha \in (N\cup T)^{*}$, par $\alpha [\sigma ]$ le mot obtenu en attachant $\sigma$ à chaque non terminal figurant dans $\alpha$. Par exemple, pour $\alpha =aBCdE$, où $a$ et $d$ sont terminaux et $B,C,E$ sont non-terminaux, $\alpha [\sigma ]=aB[\sigma ]C[\sigma ]dE[\sigma ]$.
Par définition les productions d'une grammaires indexée doivent être de l'une des formes suivantes :
* $A[\sigma ]\to \alpha [\sigma ]$
* $A[\sigma ]\to B[f\sigma ]$
* $A[f\sigma ]\to \alpha [\sigma ]$
où $A,B\in N$ sont des variables, $f\in F$ est un symbole d'index, $c\in F^{*}$ est un mot d'index et $\alpha \in (N\cup T)^{*}$ est un mot formé de symboles terminaux et non terminaux. Cela signifie donc que les piles d'index sont soit inchangées, soit augmentées ou diminuées d'un symbole d'index, mais à une extrémité seulement, ce qui leur confère une propriété d'empilement ou dépilement. On trouve aussi la notation « $.\!.$ » à la place de $\sigma$, ce qui donne l'écriture :
    $A[..]\to \alpha [..]$, $A[..]\to B[f..]$ et $A[f..]\to \alpha [..]$
Une variante de la définition ajoute les symboles d'index en fin pile et non pas au début. Les dérivations sont similaires à celles d'une grammaire non contextuelle sauf pour le symbole d'index attaché aux variables. Lors de l'application d'une règle comme
    A[σ] → B[σ]C[σ]
la pile d'index de A est copiée à la fois sur B et sur C. Les autres types de règles permettent d'empiler ou de dépiler des symboles d'index.
Formellement, on définit la relation de dérivation immédiate ou directe, notée $\Rightarrow$ sur l'ensemble des mots de (N[F^*]\cup T )^*(N[F$^*$]∪T)$^*$ comme suit :
* Pour une règle de la forme $A[\sigma ]\to \alpha [\sigma ]$, on a $\beta A[\phi ]\gamma \Rightarrow \beta \alpha [\phi ]\gamma$. En d'autres termes, la pile $\phi$ du membre gauche est recopiée dans chaque non terminal du membre droit.
* Pour une règle de la forme $A[\sigma ]\to \alpha [f\sigma ]$, on a $\beta A[\phi ]\gamma \Rightarrow \beta \alpha [f\phi ]\gamma$. En d'autres termes, la pile $\phi$ du membre gauche est recopiée dans chaque non terminal du membre droit, mais augmentée au début par le symbole $f$.
* Pour une règle de la forme $A[f\sigma ]\to \alpha [f\sigma ]$, on a $\beta A[f\phi ]\gamma \Rightarrow \beta \alpha [\phi ]\gamma$. En d'autres termes, la pile $f\phi$ du membre gauche est recopiée dans chaque non terminal du membre droit, mais sans son premier symbole $f$.
Comme d'usage, la relation de dérivation $\Rightarrow ^{*}$ est la clôture réflexive et transitive de la relation de dérivation immédiate. Le langage engendré par la grammaire est
    $L(G)=\{w\in T^{*}\mid S\Rightarrow ^{*}w\}$.
Cela signifie que l'on part de l'axiome avec une pile d'index vide, et qu'à la fin de la dérivation, la pile d'index est à nouveau vide.
La définition qui précède est donnée par John Hopcroft et Jeffrey Ullman dans leur livre de 1979. Historiquement, les grammaires indexées ont été introduites par Alfred Aho en 1968 avec un formalisme différent.

## Exemples

Les piles d'index servent à mémoriser quelles règles ont été appliquées et dans quel ordre.

### Un premier exemple

Une grammaire indexée pour les langages $\{www\mid w\in \{a,b\}^{*}\}$ :
    $S[\sigma ]\to S[f\sigma ],\quad S[\sigma ]\to S[g\sigma ],\quad S[\sigma ]\to T[\sigma ]T[\sigma ]T[\sigma ]$
    $T[f\sigma ]\to aT[\sigma ],\quad T[g\sigma ]\to bT[\sigma ]$
    $T\to \varepsilon$
Une dérivation de $abbabbabb$ est :
    $S\Rightarrow S[f]\Rightarrow S[fg]\Rightarrow S[fgg]\Rightarrow T[fgg]T[fgg]T[fgg]$
    $\quad \Rightarrow aT[gg]bT[fgg]T[fgg]\Rightarrow abT[g]T[fgg]T[fgg]\Rightarrow abbTT[fgg]T[fgg]$
    $\quad \Rightarrow abbT[fgg]T[fgg]\Rightarrow \dotsb \Rightarrow abbabbT[fgg]\Rightarrow abbabbabb$

### Un deuxième exemple

L'exemple qui suit est donné dans le livre de Hopcroft et Ullman. Le langage engendré est $\{a^{n}b^{n}c^{n}\mid n\geq 1\}$ sur l'alphabet $\{a,b,c\}$. La grammaire est :
    $S[\sigma ]\to T[g\sigma ]$
    $T[\sigma ]\to T[f\sigma ],\quad T[\sigma ]\to A[\sigma ]B[\sigma ]C[\sigma ]$
    $A[f\sigma ]\to aA[\sigma ],\quad A[g\sigma ]\to a$
    $B[f\sigma ]\to bB[\sigma ],\quad B[g\sigma ]\to b$
    $C[f\sigma ]\to cC[\sigma ],\quad C[g\sigma ]\to c$ .
Un exemple de dérivation est :
    $S\Rightarrow T[g]\Rightarrow T[fg]\Rightarrow A[fg]B[fg]C[fg]$
    $\quad \Rightarrow aA[g]B[fg]C[fg]\Rightarrow aaB[fg]C[fg]\Rightarrow aabB[g]C[fg]\Rightarrow aabbC[fg]\Rightarrow aabbcC[g]\Rightarrow aabbcc$

### Un troisième exemple

Un autre exemple est donné dans le chapitre « Aspects of Classical Language Theory » du Handbook of Formal Languages . Il s'agit du langage $\{a^{n}b^{n^{2}}a^{n}\mid n\geq 1\}$. Le formalisme donné par ces auteurs est différent : à chaque symbole d'index (ou flag) est associé un ensemble de règles de production usuelles. Les piles d'index sont créées dans une première phase, et consommées dans une deuxième phase en les remplaçant par une quelconque des règles qui y sont attachées. La grammaire est la suivante :
    $S\to Af_{1}$
    $A\to Af_{2},\quad A\to BCB$
    $f_{1}=\{B\to a,\ C\to b,\ D\to b\}$
    $f_{2}=\{B\to aB,\ C\to bCDD,\ D\to bD\}$ .
Après l'introduction des indexes, on engendre les mots de la forme
    $Bf_{2}^{n}f_{1}Cf_{2}^{n}f_{1}Bf_{2}^{n}f_{1}$.
L'élimination des indexes remplace les parties suivant la variable $B$ par $a^{n+1}$ et celle suivant C par $b^{{n+1}^{2}}$.
Aucun des trois langages n'est algébrique, comme on peut le voir par le lemme d'itération pour les langages algébriques. Pour le deuxième langage, une grammaire plus simple est donnée plus bas.

## Propriétés

Hopcroft et Ullman, dans les notes de leur livre (p. 394-395) considèrent que les langages indexés forment une classe « naturelle » de langages parce qu'ils admettent plusieurs définitions équivalents ; ce sont :
* les automates à piles emboîtées (en) uni-directionnels de Alfred Aho ;
* les macro-grammaires de Michael J. Fischer ;
* les automates à piles de piles de Sheila A. Greibach ;
* les langages d'une caractérisation algébrique de Thomas Maibaum (en)
Hayashi a généralisé le lemme d'itération pour les langages algébriques aux grammaires indexées. Dans la direction opposée, Gilman donne un lemme de réduction pour les langages indexés.

## Grammaires indexées linéaires

Gerald Gazdar (en) définit une deuxième classe de grammaires appelées maintenant grammaires indexées linéaires; elles sont définies par la propriété qu'au plus une variable dans le membre droit d'une règle peut recevoir la pile d'index, les autres ne reçoivent que la pile vide, alors que dans une grammaire indexée générale, toutes le variable obtiennent copie de la pile d'index. La définition formelle est semblable, sauf que les productions sont de l'une des formes :
* $A[\sigma ]\to \alphaB[\sigma ]\beta$
* $A[\sigma ]\to \alphaB[f\sigma ]\beta$
* $A[f\sigma ]\to \alphaB[\sigma ]\beta$
Bien entendu, d'autres productions doivent être terminales, c'est-à-dire sans variables dans le membre droit de règle. Cette classe de grammaires définit une classe de langages strictement plus petite, elle-même contenu dans la classe des langages "mildly context-sensitive" (en).
Le langage $\{www\mid w\in \{a,b\}^{*}\}$ par exemple ne peut être engendré par une grammaire linéaire, alors que les langages $\{ww\mid w\in \{a,b\}^{*}\}$ et $\{a^{n}b^{n}c^{n}\mid n\geq 1\}$ sur l'alphabet $\{a,b,c\}$ sont des langages indexés linéaires.
Si l'on autorise à la fois l'usage de productions en mode indexé et en mode indexé linéaire, la classe de langages n'augmente pas et reste celle des langages indexés

### Exemple

Les grammaires indexées dont les membres droits de règle ne comportent pas de variable ou une seule variable (les grammaires linéaires usuelles) sont par définition linéaires. Un tel exemple est la grammaire suivante pour le langage $\{a^{n}b^{n}c^{n}\mid n\geq 1\}$ :
    $S[\sigma ]\to T[\sigma ],\quad S[\sigma ]\to aT[f\sigma ]c$
    $T[f\sigma ]\to T[\sigma ]b$
    $T\to \varepsilon$
Le mot $aabbcc$ s'obtient par la dérivation suivante :
    $S\Rightarrow aS[f]c\Rightarrow aaS[ff]cc\Rightarrow aaT[ff]cc\Rightarrow aaT[f]bcc\Rightarrow aaTbbcc\Rightarrow aabbcc$

### Puissance d'expression

Les langages engendrés par des grammaires indexées linéaires forment une sous-famille des langages indexés. Une grammaire indexée linéaire peut être convertie en une grammaire indexée de manière pas très compliquée.
Vijay-Shanker et Weir montrent que les grammaires indexées linéaires sont équivalentes d'autres formalismes :
* les Combinatory Categorial Grammars (en)
* les grammaires d'arbres adjoints, et
* les Head grammar (en) ou grammaires à dérivation en tête de Carl Pollard.
D'autres familles de langages plus larges sont engendrées par des formalismes proches ; ce sont des Linear Context-free Rewriting Systems (en), ou des grammaires minimalistes (en). L'analyse syntaxique peut être réalisée en temps polynomial.

## Grammaires indexées distribuées

Une autre forme de grammaires distribuées, introduite par Peter Staudacher en 1993, est la classe des grammaires indexées distribuées qui se distingue des autres modèles par le mode de propagation des indexes.
Alors que, dans le modèle classique, la totalité de la pile d'index est transférée sur les non-terminaux lors de l'opération de réécriture, les grammaires distribuées divisent la pile d'index en segments qui sont distribués à des non-terminaux sélectionnés. Le schéma général d'une règle de distribution est dans le cas du partage en deux groupes :
    $X[f_{1}\dotso f_{i}f_{j}\dotso f_{n}]\to \alpha Y[f_{1}\dotso f_{i}]\beta Z[f_{j}\dotso f_{n}]\gamma$
où $\alpha$, $\beta$, et $\gamma$ sont des mots arbitraires. Dans le cas de trois groupes, la règle s'écrit :
    $X[f_{1}\dotso f_{i}f_{j}\dotso f_{k}f_{l}\dotso f_{n}]\to \alpha Y[f_{1}\dotso f_{i}]\beta Z[f_{j}\dotso f_{k}]\gamma W[f_{l}\dotso f_{n}]\eta$
De même pour des ordres supérieurs. Lorsque la partition est en une seule classe, on retrouve les grammaires indexées linéaires ; les langages indexés distribués forment donc une classe contenant les langages indexés linéaires.

## Articles liés

* Grammaire linéaire
* symboles non-terminaux