Flex (leksikalsk analysatorgenerator)

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 14. april 2018; checks kræver 5 redigeringer .
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] .

Brug

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-kodeblok

Definitioner 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 .

Noter

  1. 1 2 https://cvsweb.openbsd.org/src/usr.bin/lex/README
  2. https://cvsweb.openbsd.org/src/usr.bin/lex/parse.y
  3. https://cvsweb.openbsd.org/src/usr.bin/lex/COPYING
  4. (uspecificeret titel) - S. 9. - ISBN 978-0-596-15597-1
  5. Udgivelse 2.6.4 - 2017.
  6. lex 2.6.4 udgivet  (engelsk) - 2017.
  7. Cameron Mackinnon. Er fleksibel GNU eller ej? (utilgængeligt link) (2. december 1996). Hentet 1. august 2010. Arkiveret fra originalen 29. april 2012. 
  8. [ IBM. Fordel.  (utilgængeligt link) . Dato for adgang: 18. juni 2010. Arkiveret fra originalen 22. januar 2009. IBM. Fordel.  (utilgængeligt link) ]
  9. Normalt yylex().

Links