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..
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
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');
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...
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)."
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');
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 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...
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...
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");
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...