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] .
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-kodblockDefinitioner 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 .