Analizzatore lessicale

Alcune note

L'analizzatore, nel caso di token di tipo differente, estrae i token anche se non vi sono separatori tra essi (ad es.: while(a+b>c) corrisponde a 8 token). Per fare questo, l'insieme dei separatori è costituito dai soli layout-char (1-32, 127-159, 160), ma per stabilire la fine di un token ci si basa non solo sul raggiungimento del prossimo layout-char, ma anche sul carattere attualmente letto in relazione al tipo del token corrente. Come tipi di token abbiamo:

  1. token alfanumerici (composti da lettere, numeri, e underscore ( _ ) ) : non possono iniziare con una cifra;
  2. token numerici (cifre da 0 a 9);
  3. token di simboli di lunghezza = 1 (cod: 33-47, 58-64, 91-94, 96, 123-126) : per poter scrivere, ad es.: (3*-2+4)/(-5+2) ;
  4. token di simboli di lunghezza > 1 : ad es. || && >=
Quindi, qualora si incontrino 2 token adiacenti (cioè nessun separatore presente tra loro) ma di tipo diverso, l'analizzatore sarà in grado di riconoscerli ed estrarli. In particolare, 2 o più simboli (categoria 3) adiacenti generano sempre 2 token, escluso i casi indicati dalla categoria 4. Ciò significa che nell'estendere il linguaggio (o nello scriverne uno nuovo) si potrà continuare ad usare questo analizzatore lessicale a patto che si aggiungano le clausole relative ai token di lung. >1 e composti da simboli: queste clausole in realtà sono dei semplici fatti Prolog:

two_symbol_char_token('||').
two_symbol_char_token('&&').
two_symbol_char_token('=>').

Il limite principale di questo analizzatore è la possibilità di gestire solo token composti interamente da caratteri appartenenti ad una delle sopracitate categorie: incontrare un carattere di "tipo" diverso comporta, per l'analizzatore, la fine del token precedente e l'inizio di uno nuovo (ad. es: un nome di procedura "make-stack" verrebbe riconosciuto come 3 token, non come uno solo.).
D'altra parte l'analizzatore risulta assai semplice, e può essere facilmente modificabile. Inoltre è totalmente indipendente sia dal linguaggio oggetto d'analisi, sia dal compilatore/interprete.

return to developer home