Flex (lexikal analysatorgenerator)

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 14 april 2018; kontroller kräver 5 redigeringar .
Böja
Sorts lexikal analysatorgenerator
Författare Vern Paxon [d] [1][2]
Utvecklaren Vern Paxson [d] [1][3]
Skrivet i Xi
Operativ system Unix-liknande
Första upplagan 1987 [4]
Hårdvaruplattform plattformsoberoende programvara
senaste versionen
Licens BSD
Hemsida github.com/westes/flex

Flex (Fast Lexical Analyzer) - generator av lexikalanalysatorer . Ersätter Lex på system baserade på GNU -paket och har liknande funktionalitet. Flex är dock inte en del av GNU-projektet [7] .

Användning

Lex är ett lexikalt analysverktyg som kan användas för att extrahera vissa strängar från källtexten på ett förutbestämt sätt. Yacc är ett analysverktyg ; den läser text och kan användas för att konvertera en sekvens av ord till ett strukturerat format för vidare bearbetning. [åtta]

Vid ingången får programmet en text i fritt format och reglerna för markering av tokens, och vid utgången ger det analysatorkoden, i form av en funktion på C -språket . [9]

Regler anges som reguljära uttryck till vänster och vanligtvis C-kod till höger. De innehåller tre sektioner, åtskilda av raden "%%":

Definitionsblock %% Regelblock %% C-kodblock

Definitioner innehåller utgångsvärden och definitioner, regler, själva uttrycken och deras motsvarande handlingar; användarkoden ingår helt enkelt i flexutgången. Vissa avsnitt kan saknas.

Parserfunktionen tar texten som indata och exekverar den givna koden för varje token den hittar. Till exempel kommer den här koden printf ("%s", getlogin()) för varje förekomst av användarnamn i texten :

%% användarnamn printf ( "%s" , getlogin () );

Denna funktion kommer att skriva ut strängen som returneras av getlogin()-funktionen till strömmen. Det vill säga att varje förekomst av användarnamn i inmatningsflödet kommer att ersättas av värdet som returneras av getlogin().

Regler enligt vilka den slutliga funktionen ska skriva ut typen av token (om, variabel , nummer, unär eller binär operation ) och värden för vissa tokens:

%% if printf ( "IF-sats \n " ); [ a - z ] + printf ( "tagg, värde %s \n " , yytext ); { D } + printf ( "decimaltal %s \n " , yytext ); "++" printf ( "unary op \n " ); "+" printf ( "binär op \n " );

Ett exempel på att räkna antalet rader och tecken i en text:

% { int num_lines = 0 , num_chars = 0 ; % } %% \ n ++ num_lines ; ++ antal_tecken ; . ++ antal_tecken ; %% huvud () { ylex (); printf ( "Antal rader = %d, antal tecken = %d \n " , antal rader , antal tecken ); }

Funktionen som genereras av generatorn för att hitta nästa token kan användas med parsergeneratorer . I de flesta fall används flex med yacc eller GNU bison .

Anteckningar

  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. (ospecificerad titel) - P. 9. - ISBN 978-0-596-15597-1
  5. Release 2.6.4 - 2017.
  6. lex 2.6.4 släppt  (engelska) - 2017.
  7. Cameron Mackinnon. Är flexibel GNU eller inte? (ej tillgänglig länk) (2 december 1996). Hämtad 1 augusti 2010. Arkiverad från originalet 29 april 2012. 
  8. [ IBM. Fördel.  (inte tillgänglig länk) . Tillträdesdatum: 18 juni 2010. Arkiverad från originalet 22 januari 2009. IBM. Fördel.  (inte tillgänglig länk) ]
  9. Vanligtvis yylex().

Länkar