| V I S U A L I Z Z A D I S C U S S I O N E |
| socio_ipercoop |
Inserito il - 22/05/2006 : 16:41:29 Raga' qualcuno di voi e' riuscito a svolgere gli esercizi inerenti al grammar reader?? Potreste eventualmente postare qualche soluzione che sto' letteralmente impazzendo??
grazie a tutti |
| 20 U L T I M E R I S P O S T E (in alto le più recenti) |
| ermanno |
Inserito il - 23/06/2006 : 08:50:37 be si effettivamente questo serve per vedere se una grammatica è monotona ma non serve per modificarla...qualch'uno sa come si fa? |
| silent |
Inserito il - 15/06/2006 : 14:19:39 io l'esercizio sulla monotonia l'ho fatto così:
#include <stdio.h>
#define MAX_WORD_LENGTH 100 #define MAX_PRODUCTIONS 100
// Definizione dei tipi ------------------------------------------------------*/
typedef char Symbol;
typedef struct { Symbol word [MAX_WORD_LENGTH]; unsigned length; } Word;
typedef struct { Word left; Word right; } Production;
typedef struct { Production productions[MAX_PRODUCTIONS]; unsigned numprod; } Grammar;
// Procedure di riconoscimento dei simboli -----------------------------------*/
int is_terminal(Symbol s) { return (islower(s)); //return (s >= 'a') && (s <= 'z'); }
int is_nonterminal(Symbol s) { return (isupper(s)); //return (s >= 'A') && (s <= 'Z'); }
int is_prodsym(Symbol s) { return (s == '>'); }
int is_prodsep(Symbol s) { return (s == '\n'); }
/* Lettura di simboli da file ------------------------------------------------*/
Symbol read_sym(FILE* file) { Symbol s; // fscanf(file,"%c",&s); //questo ciclo permette di saltare la lettura di spazi tra i simboli do s = getc(file); while (s==' '); return s; }
Production* add_new_production(Grammar *g) { Production* p; p = &(g->productions[g->numprod++]); p->left.length = 0; return p; }
void add_symbol(Word *w, Symbol s) { w->word[w->length++] = s; }
// Procedura di acquisizione di una grammatica da un file --------------------*/ Grammar* load_grammar(FILE* file, Grammar* g) { enum States {START,LEFT,RIGHT,ERROR}; /* START = Scansione di una nuova produzione [F] LEFT = Scansione della parte sinistra RIGHT = Scansione della parte destra [F] ERROR = Errore di scansione */ enum States current_state = START; // Stato iniziale Symbol s; Production* p; g->numprod = 0; // Inizializza la grammatica while (current_state != ERROR && !feof(file)) { s = read_sym(file); if (feof(file)) break; switch(current_state) { case START: if (is_terminal(s) || is_nonterminal(s)) { 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; break; case LEFT: if (is_terminal(s) || is_nonterminal(s)) { current_state = LEFT; add_symbol(&p->left,s); } else if (is_prodsym(s)) { current_state = RIGHT; p->right.length = 0; } else current_state = ERROR; break; 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 (current_state == START || current_state == RIGHT) return g; else return NULL;
}
// Procedure di stampa
void print_sym (Symbol s) { printf("%c ",s); }
void print_word (Word* w) { int i; for (i=0; i<w->length; i++) print_sym(w->word[i]); }
void print_production (Production* p) { print_word(&p->left); printf (" --> "); print_word(&p->right); }
void print_grammar(Grammar* g) { int i; if (g == NULL) printf ("Errore! Grammatica non valida! \n"); else { printf ("Numero di produzioni: %d\n", g->numprod); for (i=0; i<g->numprod; i++) { print_production(&g->productions[i]); printf ("\n"); } } }
// Esercizio -------------------------------------------------------------------
int esercizio (Grammar* g) { int i; Production* p; Word* l; Word* r; int flag;
for (i=0; i < g->numprod; i++) { p = &g->productions[i]; l = &p->left; r = &p->right; flag = 0; if (l->length <= r->length) flag = 1; } if (flag) printf ("La grammatica e' monotona \n"); else printf ("La grammatica non e' monotona \n"); return 0; }
// MAIN ------------------------------------------------------------------------
int main(int argc, char *argv[]) { char* filename = argv[1]; FILE* gram_file; Grammar grammar; // controlla se è stato inserito il nome del file if (filename == 0) { printf("nome file non specificato \n"); return -1; } // apertura del file contenente la grammatica gram_file = fopen(filename,"r"); if (gram_file == NULL) { printf("nome di file errato\n"); return -1; } print_grammar(load_grammar(gram_file,&grammar)); esercizio(&grammar); fclose(gram_file); system("PAUSE"); return 0; }
se c'è qualcosa di sbagliato potreste dirmi dove ?? |
| krasta |
Inserito il - 15/06/2006 : 12:54:00 ho trovato finalmente la soluzione alla traccia che chiedeva se una grammatika è dipendente da contesto (muahahahahaha) la allego.....se c'è qualke bug ditemelo.grazie
Allegato: CS.zip 2,4 KB
il prog apre un file di testo chiamato "G1.txt" |
| airbag |
Inserito il - 14/06/2006 : 22:51:30 ma io credo che quell'esercizio non ci sarà troppo complesso puniamo ad altro che dite? |
| peano |
Inserito il - 14/06/2006 : 21:52:49 bè...ti servirebbe invece...se vuoi passare il lab ....nn sei molto saggio airbag  |
| airbag |
Inserito il - 14/06/2006 : 20:08:28 io userei il metodo: 'se non lo vedo non esiste' non serve nella vita questo esercizio |
| peano |
Inserito il - 14/06/2006 : 15:05:08 si certo ...magari se risolvi quell'esercizio di trasformare da monotone in contestuali...facci sapere qui  |
| anto_nella |
Inserito il - 14/06/2006 : 14:21:42 Si può semplificare ulteriormente l'esercizio: dopo la prima produzione NON monotona trovata, si può già affermare che la grammatica non è monotona!  Sto tentando di risolvere l'esercizio che trasforma una monotona in contestuale... |
| peano |
Inserito il - 14/06/2006 : 13:33:37 va bè...nn ci vuole molto..gli metti un contatore ad ogni produzione monotona ke trova..e poi se il contatore è uguale al numero di produzioni..allora è monotona.... stai tentando di risolvere l'esercizio di trasformare da monotona in contestuale? |
| anto_nella |
Inserito il - 14/06/2006 : 11:56:41 Vorrei fare una precisazione in merito alle premesse di Franz.
"-basta una produzione monotona per rendere monotona la grammatica;"
La definizione 3.5 del libro di Semeraro parla chiaro: Una grammatica è monotona se OGNI sua produzione è monotona. Quindi non è sufficiente una sola produzione monotona per rendere la grammatica monotona.
Sto cercando anche io di risolvere l'esercizio sul Grammar-Reader...se ho news vi aggiorno! Cià! |
| airbag |
Inserito il - 14/06/2006 : 11:30:54 che c'è sempre chi più chiede e meno chi da aspettiamo se uno vuole |
| peano |
Inserito il - 14/06/2006 : 09:26:27 bella la poesia....ma nn ho capito il nesso |
| airbag |
Inserito il - 14/06/2006 : 07:52:16 siamo umani e necessitiamo di essere amati come tutti gli altri fanno |
| peano |
Inserito il - 14/06/2006 : 00:02:17 cm al solito in questo forum..quando si tratta di avere...postano tutti..quando si tratta invece di dare o spiegare...nn posta mai nessuno...oppure sempre i soliti...grazie! |
| peano |
Inserito il - 13/06/2006 : 20:07:48 ragazzi almeno una linea guida...nessuno proprio ci è riuscito?? |
| Rio |
Inserito il - 13/06/2006 : 18:49:01 Io non ho trovato ancora la soluzione a questo esercizio, se qualcuno può ci aiuti please! |
| Tak3z0 |
Inserito il - 11/06/2006 : 09:22:29 vabbe insomma quello funzionanete? e' quello di fran? |
| socio_ipercoop |
Inserito il - 04/06/2006 : 21:44:35 fran a che punto sei?...io sono riuscito a fare metà parte dell'esercizio...ossia fino a quando trasformo tutta la parte sinistra con altri NT e poi eventualmente aggiungo i simboli della parte dx. ora mi manca solo la parte che riscrive la produzione finale. però ho fatto una zagnata di codice. l'importante è che funzioni poi al massimo lo aggiusto...in ogni caso teniamoci in contatto. ciao raga |
| ekkekkazz |
Inserito il - 04/06/2006 : 21:11:23 Citazione: Messaggio inserito da Rio
Fran grazie innanzitutto per aver condiviso il tuo lavoro, ma permetti un paio di domande?
funzionano queste due righe di codice?
g->productions.word[g->productions.length++]=NT_symbol; g->productions.word[g->productions.length]='\0';
come e cosa fà la funzione exist_symbol?
vuoi dire queste...
g->xv.word[g->xv.length++]=NT_symbol; g->xv.word[g->xv.length]='\0';
(quelle altre non funzionano perchè word non è un campo di Production... dovresti metterci o left o right)
cmq mi funzionano... utilizzo la length invece di un contatore, non cambia niente... alla fine devo mettere il terminatore per le stringhe...
la exist_symbol si commenta da sola... cerca Symbol s in Word w e restituisce 1 se vero
int exist_symbol(Word w, Symbol s) { int i; for (i=0;i<w.length;i++) if (s==w.word[i]) return 1; return 0; } |
| Rio |
Inserito il - 04/06/2006 : 17:49:10 Fran grazie innanzitutto per aver condiviso il tuo lavoro, ma permetti un paio di domande?
funzionano queste due righe di codice?
g->productions.word[g->productions.length++]=NT_symbol; g->productions.word[g->productions.length]='\0';
come e cosa fà la funzione exist_symbol? |