Forum by laureateci.it
[ Home | REGOLE FORUM | Tutti i blog | Profilo | Registrati | CHAT | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Download Informatica | Download ICD | Download TPS | Download Magistrale | Download Specialistica | Giochi | Cerca nel web | cerca | faq | RSS ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 INFORMATICA - Primo Anno
 Linguaggi di programmazione
 Soluzione Grammar reader

Nota: Devi essere registrato per poter inserire un messaggio.
Per registrarti, clicca qui. La Registrazione è semplice e gratuita!

Larghezza finestra:
Nome Utente:
Password:
Modo:
Formato: GrassettoCorsivoSottolineatoBarrato Aggiungi Spoiler Allinea a  SinistraCentraAllinea a Destra Riga Orizzontale Inserisci linkInserisci EmailInserisci FlashInserisci Immagine Inserisci CodiceInserisci CitazioneInserisci Lista Inserisci Faccine
   
Icona Messaggio:              
             
Messaggio:

  * Il codice HTML è OFF
* Il Codice Forum è ON

Smilies
Approvazione [^] Arrabbiato [:(!] Bacio [:X] Bevuta [:273]
Caldo [8D] Compiaciuto [8)]    
compleanno [:269]
Davvero Felice [:D] Diavoletto [}:)] Disapprovazione [V] Domanda [?]
Felice [:)] Fumata [:29] Goloso [:P] Imbarazzato [:I]
Infelice [:(] Morte improvvisa da [:62]
Morto [xx(] Occhio Nero [B)] Occhiolino [;)] Palla 8 [8]
pc [:205]    
Riproduzione [:76]
Scioccato [:O]      

   Allega file
  Clicca qui per inserire la tua firma nel messaggio.
Clicca qui per sottoscrivere questa Discussione.
    

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?

Forum by laureateci.it © 2002 - 2012 Laureateci Communications Torna all'inizio della Pagina
Il DB ha risposto in 0,09 secondi.

TargatoNA.it | SuperDeejay.Net | Antidoto.org | Brutto.it | Equiweb.it | Snitz Forum 2000