Ciao,
allora devo fare un picolo esercizietto in FLEX che è un analizzatore lessicale, il problema non riguarda tanto FLEX ma penso più che altro che non tocco C da qualche annetto e stò un po' arruginito con i puntatori...
Il frammento di codice C è il seguente:
Sostanzialmente la parte non C (cioè {consonante} significa cosa deve fare quando trova una consonante in un file di testo)codice:char consonante = 0; /* Variabile che contiene la consonante corrente riconosciuta durante dall'analizzatore */ char *cursore; /* Puntatore usato per scorrere i caratteri della parola */ {CONSONANTE} { /* Regola definita per il pattern associato al token CONSONANTE */ consonante=tolower(*yytext); /* si usa la variabile carattere per memorizzare la consonante correntemente riconosciuta */ if(consonante == *yytext++) /* Se la consonante attuale è uguale al carattere succssivo siamo nel caso di una doppia yytext++; /* Passa al carattere successivo ECHO; }
Praticamente il mio programmino scorre un file di testo e deve eliminare le consonanti doppie consecutive, per esempio:
trova la parola appiattire e la trasforma in apiatire
yytext è un [b]puntatore/b] al carattere corrente nel testo, quindi in pratica la mia logica è questa:
Se viene riconosciuta una lettera consonante nel testo (a fare il matching ci pensa FLEX ed è indicato da {CONSONANTE}, questo è sicuramente giusto), mette questa consonante corrente dentro la variabile consonante facendola diventare minuscola.
A questo punto confronta il valore della consonante corrente con il PROSSIMO ELEMENTO ALL'INTERNO DEL TESTO che ho indicato con la riga:consonante dovrebbe contenere un char e *yytext++ dovrebbe restituire il prossimo char nel testo (almeno credo ma ho dei dubbi in merito...).codice:if(consonante == *yytext++)
Se questa condizione risulta essere TRUE significa che sono in presenza di due consonanti doppie consecutive, quindi per eliminare una doppia avanzo di 1 il puntatore all'interno dei caratteri del mio testo con l'istruzione: yytext++;
Infine il comando ECHO è un comando di Flex che dice di copiare il carattere corrente sullo standard output (monitor)
Le cose sono 2:
o ho sbagliato qualcosa con i puntatori o ho un problema "algoritmico" perchè non fà quello che deve fare ma se metto delle parole nel file mi riscrive solo le loro vocali, tipo:
nel file ho la parola almanacco ed invece di restituirmi almanaco mi dà aaao (solo le sue vocali)
Qualcuno sà aiutarmi?
Grazie mille

Rispondi quotando