Re2c

Re2c
Típusú ingyenes és nyílt forráskódú szoftver és lexikális elemző generátor [d]
Beírva C és C++
Operációs rendszer platformközi
Első kiadás 1994 [1]
legújabb verzió
Állapot aktív
Weboldal re2c.org
 Médiafájlok a Wikimedia Commons oldalon

A re2c ( r egular e xpression t o c , r egular e xpression t o c ode) egy ingyenes nyílt forráskódú generátor segédprogram , amely gyors és könnyen beágyazható lexereket generál , és a következő nyelvekkel való együttműködésre van orientálva: C , C++ , Go , Rust .

A segédprogramot eredetileg Peter  Bumbulis hozta létre, és cikkében írta le [3] , később a re2c nyilvánosságra került, és azóta önkéntesek tartják karban [4] .

A segédprogram abban különbözik ismertebb analógjaitól (például lex és flex ), hogy rugalmas interakciós felülettel rendelkezik (a generált kód primitívek segítségével kölcsönhatásba lép egy külső programmal), optimalizált, nem táblázatos lexereket generál, támogatja a rögzítéseket (részegyezés kivonása). ) címkékkel ellátott determinisztikus véges automatákon (TDFA) alapul.

A segédprogramot főleg olyan projektekben használják, ahol nagy sebességű szintaxis elemzésre van szükség , mint például a Ninja [5] és a PHP [6] .

Filozófia

A re2c fő célja olyan gyors lexerek [3] előállítása , amelyek legalább olyan gyorsak, mint az ésszerűen optimalizált, kézzel írott C lexerek . A hagyományos táblázatkezelési megközelítés helyett a re2c közvetlenül kódolja a generált állapotgépet feltételes feltételek és összehasonlítások formájában. Ennek eredményeként a program gyorsabb, mint tábla alapú megfelelője [3] , és sokkal könnyebben hibakereshető és megérthető. Ezenkívül ez a megközelítés gyakran kisebb lexerekhez [3] vezet, mivel a re2c számos optimalizálást alkalmaz, mint például a DFA minimalizálása és az alagút automata felépítése [7] . A re2c másik nagyszerű tulajdonsága a rugalmas felület. Rögzített programsablon használata helyett a re2c lehetővé teszi a programozó számára, hogy az interfészkód nagy részét megírja, és a generált lexert bármilyen környezethez igazítsa. A fő ötlet az, hogy a re2c nulla költségű absztrakció legyen a programozó számára, a segédprogram használata soha nem okozhatja azt, hogy a program lassabb legyen, mint a megfelelő kézzel kódolt megvalósítás.

Jellemzők

A megvalósítás a "lookahead-TDFA" [10] [11] [12] algoritmuson alapul ;

Szintaxis

A re2c program tetszőleges számú /*!re2c ... */blokkot tartalmazhat. Minden blokk szabályok, definíciók és konfigurációk sorozatából áll (ezek keverhetők, de általában a legjobb, ha először a konfigurációkat, majd a definíciókat, majd a szabályokat helyezzük el). A szabályok alakja - REGEXP { CODE }vagy REGEXP := CODE;, ahol REGEXPegy reguláris kifejezés , és CODE- egy C kód blokkja. Ha REGEXPegyezik a bemeneti karakterlánccal, a vezérlőfolyam átkerül a megfelelő blokkra CODE. Van egy speciális szabály: az alapértelmezett szabály *helyett REGEXP, akkor aktiválódik, ha más szabály nem egyezik. A re2c mohó egyező szemantikával rendelkezik - ha több szabály egyezik, akkor a hosszabb előtagnak megfelelő szabályt részesítjük előnyben, ha az ütköző szabályok megegyeznek ugyanazzal az előtaggal, akkor a korábbi szabály élvez elsőbbséget. A definíciók formájúak NAME = REGEXP;(és ennek megfelelően NAME { REGEXP }Flex-kompatibilis módban). A konfigurációk formájúak re2c:CONFIG = VALUE;, ahol CONFIGegy adott konfiguráció neve, és VALUEegy szám vagy egy karakterlánc. Haladóbb használathoz tekintse meg a hivatalos re2c kézikönyvet [20] .

Reguláris kifejezések

A re2c a következő szintaxist használja a reguláris kifejezésekhez:

A karakterosztályok és a karakterlánc-literálok a következő escape szekvenciákat tartalmazhatják: \a, \b, \f, \n, \r, \t, \v, \\, oktális \oooés hexadecimális \xhh, \uhhhh, \Uhhhhhhhh.

Kódpéldák

Programpéldák különböző nyelveken

A következő példa egy egyszerű re2c programra mutat be példát az example.re fájlban . Ellenőrzi, hogy minden bemeneti argumentum decimális szám-e. A re2c kódja a megjegyzésekben van bekeretezve /*!re2c ... */[21] .

C :

// re2c $INPUT -o $OUTPUT -i --case-ranges #include <assert.h> bool lex ( const char * s ) { const char * YYCURSOR = s ; /*!re2c re2c:yyfill:engedélyezés = 0; re2c:define:YYCTYPE = char; szám = [1-9][0-9]*; szám { return igaz; } * { return false; } */ } int main () { assert ( lex ( "1234" )); return 0 ; }

Tekintettel arra, hogy a parancs $ re2c -is -o example.c example.reaz alábbi kódot generálja ( example.c ). A megjegyzés tartalmát /*!re2c ... */egy feltételes ugrásként és összehasonlításként kódolt determinisztikus véges automata helyettesíti, a program többi része szó szerint átmásolódik a kimeneti fájlba. Számos lehetőség van a kód generálására, általában a re2c használja az operátort ,switch de használhat beágyazott operátorokat if(mint ebben a példában az opciónál -s), vagy bittérképeket és ugrótáblákat generál . Az, hogy melyik opció a jobb, a C fordítótól függ, a re2c felhasználókat kísérletezésre ösztönzik.

/* Re2c generálta */ // re2c $INPUT -o $OUTPUT -i --case-ranges #include <assert.h> bool lex ( const char * s ) { const char * YYCURSOR = s ; { char yych ; yych = * YYCURSOR ; switch ( yych ) { eset '1' ... '9' : goto yy2 ; alapértelmezett : goto yy1 ; } yy1 : ++ YYCURSOR ; { return false ; } yy2 : yych = *++ YYCURSOR ; switch ( yych ) { eset '0' ... '9' : goto yy2 ; alapértelmezett : goto yy3 ; } yy3 : { return true ; } } } int main () { assert ( lex ( "1234" )); return 0 ; }

menj :

//go:generate re2go $INPUT -o $OUTPUT -i csomag func lex ( str string ) { var kurzor int /*!re2c re2c:define:YYCTYPE = bájt; re2c:define:YYPEEK = "str[kurzor]"; re2c:define:YYSKIP = "kurzor += 1"; re2c:yyfill:engedélyezés = 0; szám = [1-9][0-9]*; szám { return } * { pánik("hiba!")} */ } func main () { lex ( "1234\x00" ) } // A re2c által generált kód, NE SZERKESZTÉSE. //go:generate re2go $INPUT -o $OUTPUT -i csomag func lex ( str string ) { var kurzor int { var yych bájt yych = str [ kurzor ] switch ( yych ) { ' 1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' : goto yy2 alapértelmezett : goto yy1 } yy1 : kurzor += 1 { pánik ( "hiba!" ) } yy2 : kurzor += 1 yych = str [ kurzor ] switch ( yych ) { kis- és nagybetűk '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' : goto yy2 alapértelmezett : goto yy3 } yy3 : { vissza } } } func main () { lex ( "1234\x00" ) }

Rozsda :

// re2rust $INPUT -o $OUTPUT fn lex ( s : & [ u8 ]) -> bool { legyen mut kurzor = 0 ; /*!re2c re2c:define:YYCTYPE = u8; re2c:define:YYPEEK = "*s.get_unchecked(kurzor)"; re2c:define:YYSKIP = "kurzor += 1;"; re2c:yyfill:engedélyezés = 0; szám = [1-9][0-9]*; szám { return igaz; } * { return false; } */ } fn main () { állítsd! ( lex ( b"1234 \0 " )); } /* Re2c generálta */ // re2rust $INPUT -o $OUTPUT fn lex ( s : & [ u8 ]) -> bool { legyen mut kurzor = 0 ; { #[allow(unused_assignments)] let mut yych : u8 = 0 ; let mut yystate : use = 0 ; ' yyl : loop { egyezési állapot { 0 => { yych = nem biztonságos { * s . get_unchecked ( kurzor )}; kurzor += 1 ; mérkőzés yych { 0x31 ..= 0x39 => { yystate = 2 ; folytatás 'yyl ; } _ => { yystate = 1 ; folytatás 'yyl ; } } } 1 => { return false ; } 2 => { yych = nem biztonságos { * s . get_unchecked ( kurzor )}; mérkőzés yych { 0x30 .. = 0x39_ _ kurzor += 1 ; yystate = 2 ; folytatás 'yyl ; } _ => { yystate = 3 ; folytatás 'yyl ; } } } 3 => { return true ; } _ => { pánik! ( "belső lexer hiba" ) } } } } } fn main () { állítsd! ( lex ( b"1234 \0 " )); }

Szoftverprojektek re2c használatával

Lásd még

Jegyzetek

  1. (meghatározatlan cím) - doi:10.1145/176454.176487
  2. https://github.com/skvadrik/re2c/releases/tag/3.0 – 2022.
  3. 1 2 3 4 Bumbulis Peter , Donald D. Cowan. RE2C: egy sokoldalúbb szkennergenerátor (angol)  // Association for Computing Machinery, New York, NY, Egyesült Államok: magazin. - 1993. - 3-12 ( 2. köt. , 1-4. sz. ). - 70-84 . o . ISSN 1057-4514 . doi : 10.1145 / 176454.176487 .  
  4. re2c:  szerzők . Letöltve: 2022. február 11. Az eredetiből archiválva : 2011. július 21.
  5. 1 2 Ninja : build.ninja  . Nindzsa. Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. május 5..
  6. 1 2 PHP  építése . PHP belső könyv. Letöltve: 2022. február 11. Az eredetiből archiválva : 2021. május 8.
  7. Grosch József. Asztali szkennerek hatékony generálása  (angol)  // Szoftver: gyakorlat és tapasztalat 19 : magazin. - 1989. - P. 1089-1103 .
  8. Submatch kivonás, re2c  dokumentáció . Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. január 31..
  9. Ville Laurikari. NFA-k címkézett átmenetekkel, determinisztikus automatákká konvertálásuk és reguláris kifejezésekre való alkalmazása  //  Seventh International Symposium on String Processing and Information Retrieval, 2000. SPIRE 2000. Proceedings. : magazin. - 2000. Archiválva : 2022. február 8.
  10. Ulja Trofimovics (2017). „Címkézett determinisztikus véges automata előretekintéssel”. arXiv : 1907.08837 .
  11. Ulja Trofimovics. RE2C – előretekintő TDFA-n alapuló lexergenerátor  //  Software Impacts : magazin. - 2020. - Kt. 6 . - doi : 10.1016/j.simpa.2020.100027 .
  12. Ulya, Trofimovich Lookahead TDFA képekben (diák)  (angol) (PDF) (2021). Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. január 27..
  13. re2c: Kódolás  támogatása . Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. január 31..
  14. re2c: Program  interfész . Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. január 31..
  15. ↑ re2c : Tárolható állapot  . Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. január 31..
  16. re2c: Indítási  feltételek . Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. január 31..
  17. re2c:  Csontváz . Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. január 31..
  18. re2c:  Figyelmeztetések . Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. január 31..
  19. ↑ Vizualizáció , re2c dokumentáció  . Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. január 31..
  20. re2c: Felhasználói kézikönyv (C  ) . Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. január 31..
  21. re2c . Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. február 16..
  22. SpamAssassin (sa-compile  ) . Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. január 20.
  23. BRL-CAD (eszközök: re2c  ) . Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. február 11.
  24. Építési folyamat  . Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. január 20.
  25. A Yasm Modular Assembler projekt: Főbb belső  szolgáltatások . Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. január 20.
  26. felébredés  . _ Letöltve: 2022. február 11. Az eredetiből archiválva : 2022. február 11.

Linkek