b'\n_START_ARTICLE_\nFlex (software)\n_START_PARAGRAPH_\nflex \xc3\xa8 un generatore automatico di scanner. _NEWLINE_Uno scanner \xc3\xa8 un programma che, dato in input uno stream di caratteri, compie delle azioni ogni volta che incontra una determinata combinazione di caratteri (token). Per questa ragione il programma generato viene anche detto tokenizer, o analizzatore lessicale. _NEWLINE_Flex \xc3\xa8 lo standard per la generazione automatica di scanner in linguaggio C. Viene utilizzato insieme a GNU Bison per generare automaticamente programmi in grado di eseguire il parsing di stream di caratteri appartenenti ad un determinato linguaggio formale. Un\'applicazione tipica \xc3\xa8 quella della scrittura di compilatori: il programma scritto dall\'utente \xc3\xa8 lo stream di caratteri in ingresso. Lo scanner analizza questo file riconoscendo le parole chiave ed i simboli del linguaggio, passando il proprio output al parser, il quale ha il compito di riconoscere le vere e proprie regole grammaticali del linguaggio e produrre il codice macchina corrispondente al programma iniziale, o di segnalare gli errori incontrati._NEWLINE_flex \xc3\xa8 l\'alternativa libera a Lex\n_START_SECTION_\nUn semplice esempio\n_START_PARAGRAPH_\ncodice di esempio.l:_NEWLINE_%{_NEWLINE_#include <stdio.h>_NEWLINE_%}_NEWLINE__NEWLINE_%%_NEWLINE_ACCENDI     {printf("Ho ricevuto il comando accendi \\n");}_NEWLINE_SPEGNI     {printf("Ho ricevuto il comando spegni \\n");}_NEWLINE__NEWLINE_[ \\t]+ /* ignora spazio bianco */_NEWLINE_#.* /* ignora commenti */_NEWLINE_\\n/* ignora gli a capo */_NEWLINE_%%_NEWLINE_Tra i segni\xc2\xa0% iniziali si inserisce il codice che deve essere eseguito prima dello scanner. Tra i segni\xc2\xa0%% trovano posto le regole per riconoscere i token. Ciascuna regola \xc3\xa8 composta da un\'espressione regolare, uno o pi\xc3\xb9 caratteri di tabulazione e da un blocco di codice C tra parentesi graffe. Il codice viene eseguito ogni volta che viene incontrato quanto specificato dall\'espressione regolare. _NEWLINE_Quando, come nelle ultime tre regole, non viene specificato il blocco C da eseguire, i caratteri che corrispondono all\'espressione regolare della regola vengono ignorati. _NEWLINE_Se una sequenza di caratteri in ingresso non soddisfa alcuna regola, essa viene restituita in output (echo)._NEWLINE_Per compilare, in ambiente unix:_NEWLINE_passo 1) flex esempio.l_NEWLINE__NEWLINE_questo genera il file lex.yy.c_NEWLINE_passo 2) cc lex.yy.c -o esempio -lfl_NEWLINE__NEWLINE_questo compila lex.yy.c nell\'eseguibile esempio_NEWLINE_ora eseguendo il programma con il comando ./esempio e digitando dei caratteri, qualsiasi stringa viene ricopiata a console, ad eccezione delle parole chiave definite nelle due regole dello scanner: ogni volta che si digita ACCENDI o SPEGNI, seguiti da invio, il programma risponde con il corrispondente testo nelle printf._NEWLINE_Questo esempio giocattolo illustra lo scopo di flex: un completo programma C per analizzare una sequenza di caratteri (o un file) \xc3\xa8 stato generato a partire da due semplici regole._NEWLINE_Per visualizzare il programma generato da Flex digitare cat lex.yy.c_NEWLINE_Per fare analizzare un file di testo al programma digitare cat fileditesto.txt | ./esempio\n_START_SECTION_\nRiconoscimento di pattern complessi e conflitti tra regole\n_START_PARAGRAPH_\nFlex non si limita a riconoscere semplici parole, ma ciascuna regola pu\xc3\xb2 consistere in un\'espressione regolare, permettendo cos\xc3\xac di riconoscere classi di parole._NEWLINE_Se due espressioni regolari si trovano in conflitto, Flex sceglie quella in grado di coprire il maggior numero di caratteri:_NEWLINE_regola 1: ABC_NEWLINE_regola 2: [A-E]*_NEWLINE_stringa: ABCDE_NEWLINE_viene utilizzata la regola 2._NEWLINE_Se due espressioni regolari si trovano in conflitto, ed entrambe coprono lo stesso numero di caratteri nella stringa, viene utilizzata quella definita pi\xc3\xb9 in alto nel file:_NEWLINE_regola 1: X[0-9]+Y[0-9]+_NEWLINE_regola 2: [A-Z0-9]*_NEWLINE_stringa: X45Y66_NEWLINE_viene scelta la prima regola.\n_START_SECTION_\nPassaggio dei token al parser\n_START_PARAGRAPH_\nPer passare i token riconosciuti al parser del linguaggio, si utilizza l\'istruzione C return seguita dal nome del token che si vuole passare. Per convenzione e leggibilit\xc3\xa0 vengono utilizzati solo caratteri maiuscoli per i nomi dei token._NEWLINE_Ad esempio una regola potrebbe essere:_NEWLINE_[a-zA-Z][a-zA-Z0-9]*     {return TOKIDENTIFIER;}_NEWLINE_ _NEWLINE_che riconosce gli identificatori validi del linguaggio C.'