www.ovum.it

  • Aumenta dimensione caratteri
  • Dimensione caratteri predefinita
  • Diminuisci dimensione caratteri

Gli analizzatori lessicali

E-mail Stampa

Nel presente articolo cercheremo di approfondire che cosa sono gli analizzatori lessicali e quali attività essi svolgono. Vedremo di cosa è costituito un ipotetico output di dati  diretto ad un parser e proveremo a realizzare un semplice analizzatore lessicale mediante il generatore di codice Flex.

Prerequisiti

Si presume che il lettore abbia dimistichezza con il generatore di parser Bison, che conosca approfonditamente la programmazione in linguaggio C ed abbia una conoscenza generale circa la struttura dei compilatori.

Iniziamo con un esempio

Gli analizzatori lessicali svolgono compiti che possiamo così sintetizzare:

  • suddividere un testo in token (frammenti di testo);
  • codificare i token ed inviarli al parser;
  • analizzare il testo secondo delle metodologie specifiche.

Dei punti elencati i primi sono di facile comprensione e nel prosieguo dell’articolo ne daremo evidenza. L’ultimo punto invece richiede un approfondimento. L'analizzatore lessicale è sempre il primo stadio di un compilatore, proviamo ad immaginarne il flusso: il testo viene analizzato carattere per carattere, ogni volta che viene trovata una sequenza valida (presente nella lista dei token validi) questi continua ad analizzare fino a quando non viene trovata una parola chiave(o sequenza valida) e concludere "token trovato". In tale condizione, sembrerebbe logico, si può immaginare che l'analizzatore possa trasmettere il token al parser e passare ad analizzare i caratteri successivi. Non si può affermare a priori che questo sia il comportamento corretto. Dipende dai criteri di analisi stabilti. Nell'esempio che segue vedremo come in certi casi l'analizzatore non può terminare l'attività nelle condizioni proposte ma debba proseguire nella ricerca. Si consideri il seguente codice scritto in linguaggio C(my_test.c):

1 int main ( void )
2 {
3 int i=10,h=0;
4 i = i+++h;
5 printf( "il calcolo vale %d\n", i);
6 return 0 ;
7 }

Osserviamo fin da subito che tale codice non è compilabile a meno di non inserire prima della funzione main() l’include del file stdio.h. Dimentichiamoci per un attimo di questo dettaglio che esula dal contesto(non è nei nostri interessi compilare il file my_test.c). Osserviamo la riga 3. Tale dichiarazione, per quanto insolita, è corretta(nello standard C99). Abbiamo un operatore somma ‘+’ ed uno di incremento ‘++’ in sequenza, ma in quale ordine vanno interpretati tali operatori? Abbiamo due possibilità:

  • i= (i++) + h;
  • i = i + (++h);
Ultimo aggiornamento Domenica 04 Dicembre 2011 22:50
 

Comprendere i parser generati da GNU Bison

E-mail Stampa

Durante la nostra attività di programmatori quante volte ci siamo posti la domanda: come si fa un compilatore? Certamente, in modo intuitivo, sappiamo agevolmente comprendere il risultato finale ed i meccanismi che il compilatore va ad implementare. Nonostante questa approfondita conoscenza dei comportamenti sappiamo bene che realizzane un compilatore è un lavoro estremamente complesso. Un compilatore è composto in linea di massima di cinque componenti: analizzatore lessicale, parser, il generatore di pseudo codice, ottimizzatore, generatore di codice. Nell'articolo qui presentato analizzeremo come lavora un parser realizzato mediante Bison(che è un generatore di parser, cioè "genera" il codice che realizza il parser).

I parser verificano la validità di un flusso dati o per dirla in altri termini, verificano che una struttura dati rispetta una grammatica. Questi strumenti sono importantissimi nella programmazione in genere, non solo quanto bisogna realizzare dei compilatori. Nel presente articolo cercheremo di capire come se ne può realizzarne uno mediante Bison. Andremo ad analizzare come questi realizza l'attività di parsing in dettaglio.

Si prega di comunicarci eventuali errori di traduzione/punti non chiari rilevati nel presente articolo. Grazie.

Indice dei contenuti

Introduzione
Prerequisiti
Il Parser LR
Un esempio di grammatica
Le tabelle nello stile Dragon Book

Compressione della tabella di parsing
Descrizione tabelle

Altre tabelle di supporto
Riepilogo tabelle
La Routine di Parsing Generata da Bison - yyparse ()
Un Esempio di Parsing
Storia del documento/story of the document
Riferimenti
Copia di questo documento
Licenza GNU

Introduzione

Bison è un generatore di parser che converte una grammatica di tipo context-free in un parser di tipo LALR(1) o GLR in codice C o C ++. Tra le funzioni generate abbiamo la funzione di parsing che può essere chiamata esternamente dall'applicazione.

Come viene realizzato un parser mediante bison può essere utile per capire quali sono le differenze rispetto ai parser che vengono descritti nei molti testi specifici. Conoscere il codice di parsing ottenuto inoltre, ci consente di poterlo modificare al fine di ottimizzarne la performace: in alcuni casi ad esempio può essere più conveniente avere diverse funzioni di parsing (yyparse, più piccole) piuttusto che una che le comprenda tutte.

Ultimo aggiornamento Venerdì 03 Giugno 2011 17:07
 

I Casi D'uso

E-mail Stampa

Il processo di creazione di un software prevede una fase precedente la scrittura del codice vera e propria, che viene denominata “creazione del casi d’uso”. In questa fase preliminare vengono presi in esame i comportamenti che, a livello macroscopico, si desiderano ottenere dal software da realizzare. In numerosi casi si tratta di un’operazione poco complessa e dalla logica facilmente comprensibile: senza addentrarci nei meandri dell’ingegneria del software, illustriamo con un esempio come possano configurarsi i casi d’uso relativi a un comune sito Internet.

Immaginiamo di voler commissionare un sito Internet a un’azienda specializzata. Come procediamo? Anzitutto, prima di parlare in dettaglio di casi d’uso, bisogna mettere a fuoco le macrocaratteristiche del sito che si desidera realizzare, stilandone un elenco. Un metodo semplice ed efficace può essere questo: nel caso, per esempio, di un sito costituito prevalentemente da articoli informativi, si consideri ogni punto della lista che segue come se fosse preceduto dalla frase «Voglio un sito internet che...»:

  1. ... contenga un menù a ciascuna riga del quale corrisponda un articolo;
  2. ... sia facilmente integrabile con ulteriori articoli;
  3. ... riporti, ben visibile, il logo della mia azienda;
  4. ... renda disponibile una voce di menù mediante la quale sia possibile contattarmi;
  5. ... contenga una voce di menù che visualizzi la mappa della localizzazione geografica della mia azienda;
  6. ... consenta l’inserimento di immagini;
  7. ... consenta la registrazione e il login degli utenti;
  8. ... consenta l’invio di messaggi a una mailing list.

 

Ultimo aggiornamento Sabato 20 Novembre 2010 15:04