Flex | |
---|---|
Tyyppi | leksikaalinen analysaattori generaattori |
Tekijä | Vern Paxon [d] [1][2] |
Kehittäjä | Vern Paxon [d] [1][3] |
Sisään kirjoitettu | Xi |
Käyttöjärjestelmä | Unixin kaltainen |
Ensimmäinen painos | 1987 [4] |
Laitteistoalusta | monikäyttöinen ohjelmisto |
uusin versio |
|
Lisenssi | BSD |
Verkkosivusto | github.com/westes/flex |
Flex (Fast Lexical Analyzer) - leksikaalisten analysaattoreiden generaattori . Korvaa Lexin GNU -paketteihin perustuvissa järjestelmissä ja sillä on samanlaiset toiminnot. Flex ei kuitenkaan ole osa GNU-projektia [7] .
Lex on leksikaalinen analyysityökalu , jonka avulla voidaan poimia tiettyjä merkkijonoja lähdetekstistä ennalta määrätyllä tavalla. Yacc on jäsennystyökalu ; se lukee tekstiä ja sitä voidaan käyttää sanasarjan muuntamiseen strukturoituun muotoon jatkokäsittelyä varten. [kahdeksan]
Ohjelma vastaanottaa sisääntulossa tekstin vapaassa muodossa ja säännöt merkkien korostamiseen, ja lähdössä antaa analysaattorikoodin funktion muodossa C -kielellä . [9]
Säännöt määritetään säännöllisinä lausekkeina vasemmalla ja tavallisesti C-koodi oikealla. Ne sisältävät kolme osiota, jotka erotetaan rivillä "%%":
Määritelmälohko %% Sääntölohko %% C-koodilohkoMääritelmät sisältävät alkuarvoja ja määritelmiä, sääntöjä, itse lausekkeita ja niitä vastaavat toiminnot; käyttäjäkoodi sisällytetään yksinkertaisesti flex-lähtöön. Jotkut osiot saattavat puuttua.
Jäsentäjätoiminto ottaa tekstin syötteeksi ja suorittaa annetun koodin jokaiselle löytämälleen tunnukselle. Esimerkiksi tämä koodi tulostaa f ("%s", getlogin ()) jokaiselle käyttäjänimen esiintymiselle tekstissä :
%% käyttäjätunnus printf ( "%s" , getlogin () );Tämä funktio tulostaa streamiin getlogin()-funktion palauttaman merkkijonon. Eli jokainen käyttäjänimen esiintyminen syöttövirrassa korvataan getlogin(:n) palauttamalla arvolla.
Säännöt, joiden mukaan lopullisen funktion tulee tulostaa tunnuksen tyyppi (jos, muuttuja , numero, yksi- tai binääritoiminto ) ja arvot joillekin tokeneille:
%% if printf ( "IF-lause \n " ); [ a - z ] + printf ( "tunniste, arvo %s \n " , yytext ); { D } + printf ( "desimaaliluku %s \n " , yytext ); "++" printf ( "unary op \n " ); "+" printf ( "binary op \n " );Esimerkki tekstin rivien ja merkkien laskemisesta:
% { int rivien_määrä = 0 , merkkien_määrä = 0 ; % } %% \ n ++ rivien_määrä ; ++ merkkien_määrä ; . ++ merkkien_määrä ; %% tärkein () { ylex (); printf ( "rivien määrä = %d, merkkien määrä = %d \n " , rivien_määrä , merkkien_määrä ); }Generaattorin luomaa funktiota seuraavan tunnuksen löytämiseksi voidaan käyttää jäsennysgeneraattoreiden kanssa . Useimmissa tapauksissa flexiä käytetään yaccin tai GNU bisonin kanssa .