Flex (leksikaalinen analysaattorigeneraattori)

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 14. huhtikuuta 2018 tarkistetusta versiosta . tarkastukset vaativat 5 muokkausta .
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] .

Käyttö

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

Mää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 .

Muistiinpanot

  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. (määrittelemätön nimi) - P. 9. - ISBN 978-0-596-15597-1
  5. Julkaisu 2.6.4 - 2017.
  6. lex 2.6.4 julkaistu  (englanniksi) - 2017.
  7. Cameron Mackinnon. Onko joustava GNU vai ei? (linkki ei saatavilla) (2. joulukuuta 1996). Haettu 1. elokuuta 2010. Arkistoitu alkuperäisestä 29. huhtikuuta 2012. 
  8. [ IBM. Hyöty.  (linkki ei saatavilla) . Käyttöpäivä: 18. kesäkuuta 2010. Arkistoitu alkuperäisestä 22. tammikuuta 2009. IBM. Hyöty.  (linkki ei saatavilla) ]
  9. Yleensä yylex().

Linkit