Una gramàtica incontextual (CFG, Context Free Grammar) [latex]G[/latex] és un conjunt de regles de substitució on les parts esquerres són mots de longitud 1. Aquestes regles les anomenarem produccions i les seves parts esquerres variables (o no-terminals). Els símbols restants els anomenem terminals.

Dues regles com per exemple [latex]S \rightarrow aS[/latex] i [latex]S \rightarrow X[/latex] es poden representar de forma agrupada de la següent manera: [latex]S \rightarrow aS | X[/latex].

En una gramàtica sempre hi ha una variable (normalment la primera que apareix) que anomenem símbol inicial. Les paraules generades per la gramàtica són aquelles formades per terminals a les quals es pot arribar des del símbol inicial.

Podem representar les substitucions necessàries per arribar a una paraula amb la sintaxi ja coneguda, o bé en forma d’arbre (arbre de derivació o arbre sintàctic).

Les gramàtiques incontextuals també es poden representar formalment com una tupla [latex]G=\langle{}V,\Sigma,\delta,S\rangle[/latex].

Un llenguatge s’anomena llenguatge incontextual si existeix una gramàtica que el genera. Existeixen algorismes [latex]O(n^3)[/latex] per comprovar si una paraula és generable per una gramàtica i generar-ne l’arbre sintàctic. Això és útil per a compiladors i intèrprets.

Quan una gramàtica permet més d’un arbre de derivació per a una paraula diem que és ambigua. Això no és desitjable quan volem utilitzar la gramàtica per interpretar el significat de les entrades.

Un criteri per determinat l’ambigüitat quan només utilitzem regles lineals (on cada alternativa de la part dreta només inclou una única variable): si no existeixen dues alternatives amb que es pugui generar el mateix, llavors la regla no genera ambigüitat.


Operacions sobre gramàtiques

Els llenguatges incontextuals estan tancats per unió: Tenim dues CFG [latex]G_1[/latex] i [latex]G_2[/latex] que generen els llenguatges [latex]\mathcal{L}(G_1)=L_1[/latex] i [latex]\mathcal{L}(G_2)=L_2[/latex]. Suposem que els llenguatges no comparteixen variables (si no fos així, les podem reanomenar). Si definim la operació unió de gramàtiques [latex]G_1\cup G_2=\langle V_1 \cup V_2 \cup \{S\}, \Sigma_1 \cup \Sigma_2, \delta_1 \cup \delta_2 \cup \{S \rightarrow S_1|S_2, S\}\rangle[/latex] llavors aquesta compleix [latex]\mathcal{L}(G_1 \cup G_2) = \mathcal{L}(G_1) \cup \mathcal{L}(G_2) = L_1 \cup L_2[/latex].

També ho són per concatenació. Amb les mateixes condicions que abans, [latex](G_1\cdot G_2)=\langle V_1 \cup V_2 \cup \{S\}, \Sigma_1 \cup \Sigma_2, \delta_1 \cup \delta_2 \cup \{S \rightarrow S_1S_2\}, S\rangle[/latex] compleix [latex]\mathcal{L}(G_1\cdot G_2)=\mathcal{L}(G_1)\cdot \mathcal{L}(G_2)=L_1\cdot L_2[/latex].

Per l’operació estrella: [latex]G^*=\langle V \cup \{S’\}, \Sigma, \delta \cup \{S’ \rightarrow S’S|\lambda\}, S’\rangle[/latex] compleix [latex]\mathcal{L}(G^*)=\mathcal{L}(G)^*=L^*[/latex].

Per l’operació revessat: [latex]G^R=\langle V, \Sigma, \{X \rightarrow u^R | (X \rightarrow u) \in \delta\}, S’\rangle[/latex] compleix [latex]\mathcal{L}(G^R)=\mathcal{L}(G)^R=L^R[/latex] ja que [latex]\forall X \in V, \mathcal{L}(G, X)^R \subseteq \mathcal{L}(G^R,X)[/latex].

I per imatge de morfisme: [latex]L \in CFL[/latex] i [latex]\sigma: \Sigma_1 \rightarrow \Sigma_2[/latex] tal que [latex]\sigma(uv)=\sigma(u)\sigma(v) \Rightarrow \sigma(L) \in CFL[/latex]. En aquest cas a la tupla de la gramàtica resultant es substitueix [latex]\delta[/latex] per [latex]\{X\rightarrow \sigma(u) | (X \rightarrow u) \in \delta\}[/latex].

En canvi, no són tancats per intersecció (si [latex]L_1, L_2 \in CFL \nRightarrow (L_1 \cap L_2) \in CFL[/latex]) ni complementari.

Aquests apunts estan basats en els vídeos de Teoria de la Computació de Guillem Godoy (UPC).