Flex | |
---|---|
Type | leksikalsk analysator generator |
Forfatter | Vern Paxon [d] [1][2] |
Udvikler | Vern Paxon [d] [1][3] |
Skrevet i | Xi |
Operativ system | Unix-agtig |
Første udgave | 1987 [4] |
Hardware platform | software på tværs af platforme |
nyeste version | |
Licens | BSD |
Internet side | github.com/westes/flex |
Flex (Fast Lexical Analyzer) - generator af leksikale analysatorer . Erstatter Lex på systemer baseret på GNU- pakker og har lignende funktionalitet. Flex er dog ikke en del af GNU-projektet [7] .
Lex er et leksikalsk analyseværktøj , der kan bruges til at udtrække bestemte strenge fra kildeteksten på en forudbestemt måde. Yacc er et parsingværktøj ; den læser tekst og kan bruges til at konvertere en sekvens af ord til et struktureret format til videre behandling. [otte]
Ved indgangen modtager programmet en tekst i et frit format og reglerne for at fremhæve tokens, og ved udgangen giver det analysatorkoden, i form af en funktion i C -sproget . [9]
Regler er angivet som regulære udtryk til venstre og normalt C-kode til højre. De indeholder tre sektioner, adskilt af linjen "%%":
Definitionsblok %% Regelblok %% C-kodeblokDefinitioner indeholder startværdier og definitioner, regler, selve udtrykkene og deres tilsvarende handlinger; brugerkoden er blot inkluderet i flex output. Nogle afsnit kan mangle.
Parserfunktionen tager teksten som input og udfører den givne kode for hver token, den finder. For eksempel vil denne kode printf ("%s", getlogin()) for hver forekomst af brugernavn i teksten :
%% brugernavn printf ( "%s" , getlogin () );Denne funktion vil udskrive strengen, der returneres af getlogin()-funktionen til strømmen. Det vil sige, at hver forekomst af brugernavn i inputstrømmen vil blive erstattet af værdien returneret af getlogin().
Regler i henhold til hvilke den endelige funktion skal udskrive typen af token (hvis, variabel , tal, unær eller binær operation ) og værdier for nogle tokens:
%% if printf ( "IF-sætning \n " ); [ a - z ] + printf ( "tag, værdi %s \n " , yytekst ); { D } + printf ( "decimaltal %s \n " , yytekst ); "++" printf ( "ulært op \n " ); "+" printf ( "binær op \n " );Et eksempel på at tælle antallet af linjer og tegn i en tekst:
% { int antal_linjer = 0 , antal_tegn = 0 ; % } %% \ n ++ antal_linjer ; ++ antal_tegn ; . ++ antal_tegn ; %% vigtigste () { ylex (); printf ( "# linjer = %d, # tegn = %d \n " , antal_linjer , antal_tegn ); }Funktionen genereret af generatoren for at finde det næste token kan bruges med parsergeneratorer . I de fleste tilfælde bruges flex med yacc eller GNU bison .