| V I S U A L I Z Z A D I S C U S S I O N E |
| krasta |
Inserito il - 09/04/2006 : 14:39:18 ragazzi quale potrebbe essere una funzione in C per determinare se una grammatica è dipendente da contesto (basta controllare se è monotona e basta?)...grazie |
| 7 U L T I M E R I S P O S T E (in alto le più recenti) |
| Tak3z0 |
Inserito il - 12/06/2006 : 10:17:57 scusa ma e' un problema solo mio che non riesco a vedere tutta la codifica quando la si posta [vedi codifiche postate da fran] credo manchi qualcosa tipo i controlli del while ad esempio ora non se e' un problema solo mio pls potreste uppere il file grazie assai ^^ |
| ekkekkazz |
Inserito il - 14/04/2006 : 00:29:30 Citazione: Messaggio inserito da peano
basta controllare la monotonia e stop..
ma non basta... se io voglio distinguere una produzione lineare da una dipendente? per esempio A->bC è monotona, però non è CS... ok, vabene il teorema della gerarchia per cui L3 in L2 in L1, però qui non basta... la monotonia è una condizione necessaria ma non sufficiente. |
| peano |
Inserito il - 12/04/2006 : 09:57:03 basta controllare la monotonia e stop.. |
| ekkekkazz |
Inserito il - 12/04/2006 : 01:50:01 ok, questa funzione funziona... praticamente estrae i contesti... ora per confrontarli avevo pensato a tipo due puntatori alla parte destra come nella palindrome (Caponetti, brrrr)
int find_context(Production *p, Symbol *y, Symbol *z) { int i,j,index[10],k=0; index[0]=-1;
for (j=0;j<p->left.length;j++) { if (!exist_symbol(p->right,p->left.word[j])) { index[k++]=j; } }
int y_limit=min(index,k); int z_limit=max(index,k);
if (index[0]==-1) return 0;
for (j=0;j<y_limit;j++) *(y++)=p->left.word[j]; *y='\0'; for (j=z_limit+1;j<p->right.length;j++) *(z++)=p->left.word[j]; *z='\0';
return 1; }
oh krasta auguri
|
| ekkekkazz |
Inserito il - 10/04/2006 : 17:32:45 in effetti la soluzione che ho dato io la possiamo buttare... y,z sono in (XuV)*, perciò possono essere anche lambda oppure aF o una qualsiasi forma di frase... il problema è proprio il riconoscimento dei contesti, o più che altro il riconoscimento di A in yAz -> ywz... prendiamo una produzione BCD->BCe... dobbiamo trovare un modo per determinare la D, e ottenere che tutto il resto della stringa che sta a sinistra è y, e tutto quello a destra è z... Quindi con un'iterazione per tutti i simboli della parola BCe, cercarsi il corrispondente in BCD... ci rimarranno soltanto la D e la 'e'... quindi tutto quello a sinistra della D è y, tutto quello a destra è z... controlliamo che y e z sono uguali a quelli di destra rispetto alla 'e'...
vediamo se riesco a combinare qualcosa col compilatore... poi c'è il problema delle lambda produzione... una cosa alla volta però... |
| krasta |
Inserito il - 10/04/2006 : 13:58:22 si ma il contesto come lo controllo ?
yAz -> ywz
il contesto y-z come lo controllo ? |
| ekkekkazz |
Inserito il - 09/04/2006 : 18:08:17 una soluzione potrebbe essere questa: oltre al controllo della monotonia, fare una iterazione per tutta la lunghezza della parte sinistra e verificare che esista un terminale; se questo esiste, controllare con un'altra iterazione annidata che esista lo stesso terminale anche nella parte destra, e quindi è context-sensitive... poi bisognerebbe fare un controllo per verificare che nella parte sinistra esista almeno un NT... |