05/01/13 15:16
dmr
Ciao a tutti sto studiando il libro: Compilatori Princpi tecniche e strumenti, e sono arrivato allo studio dei parser predittivi.
Ho implementato il seguente algoritmo scritto sul libro:
Nello stack dell'algoritmo c'è già E$ con E alla cima.
m sarebbe la tabella(creata con le funzioni first e follow) che serve al parser per l'analisi della stringa in input, e contiene:
i + * ( ) $
E TE' TE'
E' +TE' ε ε
T FT' FT'
T' ε *FT' ε ε
F i (E)
La grammatica è:
E--> TE'
E'--> +TE'| ε
T--> FT'
T'--> *FT'| ε
F--> (E)|i
L'algorimo, data la tabella della precedente grammatica, deve riconoscere la stringa in input(riconosciuta attraverso la sua grammatica) , in modo da dire se ci sono errori sintattici.
Eseguendo l'algoritmo noto che:
1)Se all'algoritmo do in input($ lo sarebbe il terminatore di stringa): i+i*i$ // nessun problema, infatti è sintatticamente corretta.
2)Se do in input: ((i)*(i)$ // l'algoritmo segnala un errore di sintassi,infatti manca )
3)Se invece do in input: i)$ //non ricevo nessun errore(ma dovrebbe esserci)
Anche se analizzo la stringa a mano non mi risultano esserci errori se applico quell'algoritmo.
Come posso fare affinchè dando in input: i)$ riceva un errore sintattico?
Grazie in anticipo!.
Ho implementato il seguente algoritmo scritto sul libro:
Nello stack dell'algoritmo c'è già E$ con E alla cima.
ip punta al primo simbolo in ingresso assegna a X il simbolo alla cima dello stack a=input[ip] while(X!=$) { if(X è a)Rimuovi l'elemento dalla cima dello stack e avanza il puntatore ip else if(X è un terminale) errore(); else if(m[x,a]=X--> Y1,Y2....Yk) { produci come uscita la produzione X--> Y1,Y2....Yk; rimuovi l'elemento dalla cima dello stack; poni Yk,Yk-1.... Y1 sullo stack, con y1 in cima; } assegna a X il simbolo alla cima dello stack; }
m sarebbe la tabella(creata con le funzioni first e follow) che serve al parser per l'analisi della stringa in input, e contiene:
i + * ( ) $
E TE' TE'
E' +TE' ε ε
T FT' FT'
T' ε *FT' ε ε
F i (E)
La grammatica è:
E--> TE'
E'--> +TE'| ε
T--> FT'
T'--> *FT'| ε
F--> (E)|i
L'algorimo, data la tabella della precedente grammatica, deve riconoscere la stringa in input(riconosciuta attraverso la sua grammatica) , in modo da dire se ci sono errori sintattici.
Eseguendo l'algoritmo noto che:
1)Se all'algoritmo do in input($ lo sarebbe il terminatore di stringa): i+i*i$ // nessun problema, infatti è sintatticamente corretta.
2)Se do in input: ((i)*(i)$ // l'algoritmo segnala un errore di sintassi,infatti manca )
3)Se invece do in input: i)$ //non ricevo nessun errore(ma dovrebbe esserci)
Anche se analizzo la stringa a mano non mi risultano esserci errori se applico quell'algoritmo.
Come posso fare affinchè dando in input: i)$ riceva un errore sintattico?
Grazie in anticipo!.
Ultima modifica effettuata da dmr 05/01/13 16:15
aaa