Ho provato a fare questo esercizio: costruire una Grammatica G=(T, N, P, S) di Tipo 2 per generare frasi di selezione del Linguaggio C della forma:
if(condizione) {................} else {................}
dove per il blocco {................} si consideri un'istruzione di assegnazione.
Con T si intende l'alfabeto dei terminali, con N l'alfabeto dei non terminali, con S l'assioma e con P l'insieme delle produzioni.
Io l'ho svolto in questo modo:
T={'if', 'else', '(', ')', '{', '}', '=', '==', '>', '<', '>=', '<=', '!=', 'a', 'b', ..., 'z', '0', '1', ..., '9', ';'}
N={'<assioma>', '<condizione>', '<blocco>', '<variabile>', '<op.confronto>', '<numero>', '<lettera>', '<secondaparte>', '<cifra>', '<assegnamento>'}
S={'<assioma>'}
Questo invece è l'elenco delle produzioni:
<assioma> $\to$ if<condizione><blocco>else<blocco>
<condizione> $\to$ (<variabile><op.confronto><numero>) | (<variabile><op.confronto><variabile>)+
<variabile> $\to$ <lettera> | <lettera><secondaparte>
<secondaparte> $\to$ <lettera> | <numero> | 0 | <lettera><secondaparte> | <numero><secondaparte> | 0<secondaparte>
<cifra> $\to$ 1 | 2 | ... | 9
<numero> $\to$ <cifra> | <cifra>0 | <cifra><numero> | <cifra>0<numero>
<op.confronto> $\to$ == | > | < | >= | <= | !=
<assegnamento> $\to$ <variabile>=<numero>; | <variabile>=<variabile>;
<blocco> $\to$ {<assegnamento>} | {<assegnamento><blocco>}
Secondo voi così può andare?
Grazie