Autore |
Discussione |
SD83
Utente assiduo
Regione: Puglia
Prov.: Foggia
|
Inserito il - 17/10/2008 : 11:46:24
|
allora ho provato pure ad invocare la tua funzione nel main
print_grammar(load_grammar(gram_file,&grammar)); esercizio(&grammar); // ho aggiunto questa riga
fclose(gram_file);
system("PAUSE"); return 0; }
l'effetto non è quello desiderato la funzione tua stampa produzione corretta se trova almeno una corretta per esempio S>a a>b C>dd
ha come output la stampa di produzione corretta perchè quando legge la prima S>a che è corretta stampa già il messaggio senza preoccuparsi delle produzioni che vengono dopo..
|
|
|
titty2008
Utente giovane
|
Inserito il - 17/10/2008 : 12:19:07
|
ok ti ringrazio... sei veramente molto gentile... |
|
|
SD83
Utente assiduo
Regione: Puglia
Prov.: Foggia
|
Inserito il - 17/10/2008 : 12:23:49
|
comunque ho corretto la tua funzione..
void esercizio (Grammar* g) { int i; //indice delle produzioni int j; //indice per la scansione del corpo di una produzione int flag; //se è 0 non ci sono simboli nt se è 1 c'è almeno un simbolo nt
for (i=0; i<g->numprod; i++) { flag = 0; // prima di scandire la nuova produzione impostiamo il valore a NT non presenti for (j=0; j < g->productions[i].left.length; j++) { if (is_nonterminal(g->productions[i].left.word[j])) flag = 1; } if (flag==1) printf ("Nella Produzione %d c'e' almeno un simbolo nonterminale!\n", i+1); else printf ("Nella Produzione %d non ci sono simboli nonterminali!\n", i+1); }
}
non hai bisogno di restituire un valore.. basta che ad ogni produzione stampi un messaggio..
comunque fai come ti ho detto prima, fai tutto nel load grammar |
|
|
titty2008
Utente giovane
|
Inserito il - 17/10/2008 : 12:56:27
|
ok... grazie veramente tanto... |
|
|
SD83
Utente assiduo
Regione: Puglia
Prov.: Foggia
|
Inserito il - 17/10/2008 : 13:02:14
|
|
|
|
titty2008
Utente giovane
|
Inserito il - 20/10/2008 : 10:32:14
|
per quanto riguarda il controllo dell'esistenza della S ho fatto come mi hai detto tu, ma evidentemente ho sbagliato, perchè mi da diversi errori... case RIGHT: if (is_terminal(s) || is_nonterminal(s)) { current_state = RIGHT; add_symbol(&p->right,s); } else if (is_prodsep(s)) { current_state = START; } else current_state = ERROR; break; } } if (is_nonterminal(s) = 'S') printf ('La produzione è corretta\n'); if (current_state == START || current_state == RIGHT) return g; else return NULL;
} cosa ho sbagliato? |
|
|
titty2008
Utente giovane
|
Inserito il - 20/10/2008 : 10:56:23
|
ehi ma per quanto riguarda gli esercizi sull'analizzatore lessicale, bisogna scaricarsi il pascal? |
|
|
SD83
Utente assiduo
Regione: Puglia
Prov.: Foggia
|
Inserito il - 20/10/2008 : 11:37:24
|
no |
|
|
titty2008
Utente giovane
|
Inserito il - 20/10/2008 : 12:00:54
|
Il primo esercizio che riguarda l'analizzatore lessicale dice: Analizzare e discutere lo schema di riconoscimento delle varie classi di token del linguaggio di riferimento (fare riferimento al codice sorgente). Io non ho capito cosa bisogna fare... |
|
|
SD83
Utente assiduo
Regione: Puglia
Prov.: Foggia
|
Inserito il - 20/10/2008 : 12:21:32
|
niente.. capire come funziona..
|
|
|
titty2008
Utente giovane
|
Inserito il - 20/10/2008 : 13:50:12
|
ah, quindi non è che devo scrivere qualcosa... |
|
|
Stewie83
Utente medio
Prov.: Brindisi
Città: Brindisi
|
Inserito il - 20/10/2008 : 15:05:20
|
non devi far niente? il parser C-like!!!!!!!!!! quello spiegato a lezione è un Pascal-like e tu devi implementare quello per il C |
********a volte è meglio stare in silenzio e passare per deficienti che parlare e dare conferma************************************************ |
|
|
SD83
Utente assiduo
Regione: Puglia
Prov.: Foggia
|
Inserito il - 20/10/2008 : 21:03:46
|
non devi far niente è rivolto a: "Analizzare e discutere lo schema di riconoscimento delle varie classi di token del linguaggio di riferimento (fare riferimento al codice sorgente)."
gli altri punti sono un altro fatto.. |
|
|
SD83
Utente assiduo
Regione: Puglia
Prov.: Foggia
|
Inserito il - 20/10/2008 : 21:06:18
|
Citazione: Messaggio inserito da titty2008
per quanto riguarda il controllo dell'esistenza della S ho fatto come mi hai detto tu, ma evidentemente ho sbagliato, perchè mi da diversi errori... case RIGHT: if (is_terminal(s) || is_nonterminal(s)) { current_state = RIGHT; add_symbol(&p->right,s); } else if (is_prodsep(s)) { current_state = START; } else current_state = ERROR; break; } } if (is_nonterminal(s) = 'S') printf ('La produzione è corretta\n'); if (current_state == START || current_state == RIGHT) return g; else return NULL;
} cosa ho sbagliato?
if (is_nonterminal(s) = 'S') printf ('La produzione è corretta\n');
fammi capire.. tu hai solo aggiunto sta riga per il controllo della S? |
|
|
titty2008
Utente giovane
|
Inserito il - 21/10/2008 : 10:15:11
|
si, però non me lo dire così... lo so che è sbagliato... perchè ho pravato a fare il controllo nella funzione load grammar, dove mi hai detto tu... se tu non mi avessi detto niente avrei fatto tipo l'esercizio 1 che ho fatto io... ma mi hai dato il consiglio che così era meglio... ti stai accorgendo anche tu che sono un caso perso?
|
|
|
titty2008
Utente giovane
|
Inserito il - 21/10/2008 : 10:19:54
|
Citazione: Messaggio inserito da SD83
non devi far niente è rivolto a: "Analizzare e discutere lo schema di riconoscimento delle varie classi di token del linguaggio di riferimento (fare riferimento al codice sorgente)."
gli altri punti sono un altro fatto..
lo so che gli altri punti sono un'altra cosa e sono da svolgere... ho già provato a fare l'es 2.a. Non so se è giusto... case GRAFFA: if (c == '}') { current_state = S; } break; l'ho appena fatto, ci devo ragionare ancora un pò... cmq ti ringrazio per tutto l'aiuto che mi stai dando... |
|
|
titty2008
Utente giovane
|
Inserito il - 21/10/2008 : 11:14:39
|
allora, quello delle parentesi graffe come commento l'ho modificato in questo modo: all'inizio nei tipi di token ho aggiunto GRAFFA_AP e GRAFFA_CH. nella successiva enumerazione ho aggiunto COMMENTO. dopo case S: ... ... case '{': current_state = COMMENTO; tkn->value[i++] = c; break; case '}': tkn->type = GRAFFA_CH; tkn->value[i++] = c; eot = !0; break; .... .... .... case COMMENTO: if (c == '}') { current_state = S; } else { lookahead = !0; eot = !0; tkn->type = GRAFFA_CH; } E' giusto? spero proprio di si...
|
|
|
SD83
Utente assiduo
Regione: Puglia
Prov.: Foggia
|
Inserito il - 21/10/2008 : 16:55:47
|
Citazione: Messaggio inserito da titty2008
si, però non me lo dire così... lo so che è sbagliato... perchè ho pravato a fare il controllo nella funzione load grammar, dove mi hai detto tu... se tu non mi avessi detto niente avrei fatto tipo l'esercizio 1 che ho fatto io... ma mi hai dato il consiglio che così era meglio... ti stai accorgendo anche tu che sono un caso perso?
non preoccuparti.. ti avevo detto di farlo nella load grammar.. ma non così.. il controllo della S devi farlo per ogni nuova produzione che carica la load grammar (stato start e stato left) se la S viene trovata setti un flag (ad es. lo chiami S_trovata) a 1 poi alla fine del ciclo dove tu hai aggiunto erroneamente if (is_nonterminal(s) = 'S') devi mettere invece if (S_trovata==1) printf("Nella Grammatica c'è almeno una S a sinistra");
|
|
|
titty2008
Utente giovane
|
Inserito il - 22/10/2008 : 10:19:26
|
Ah ecco, giusto... grazie!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
|
|
titty2008
Utente giovane
|
Inserito il - 22/10/2008 : 10:45:25
|
case START: if (is_terminal(s) || is_nonterminal(s)) { S_trovata = 0; if (is_nonterminal(s) == 'S') S_trovata = 1; current_state = LEFT; //p = &(g->productions[g->numprod++]); //p->left.length = 0; p = add_new_production(g); add_symbol(&p->left,s); //L'istruzione precedente corrisponde a p->left.word[p->left.length++] = s; } else if (is_prodsep(s)) { current_state = START; } else current_state = ERROR; S_trovata = 0; break; Spero che questa volta sia giusto... anche solo per non fare un abrutta figura... il problema è che io non posso compilare i programmi sul grammar reader perchè mi da quei problemi... che palle... |
|
|
Discussione |
|