Ragel

Ragel
Deweloperzy Adriana Thurstona
Wersja stabilna
6.10 / 24 marca 2017 ; 5 lat temu ( 2017-03-24 )
Wersja podglądu
7.0.4 / 16 lutego 2021 ; 2 lata temu ( 2021-02-16 )
Magazyn
Napisane w C++
System operacyjny Uniksopodobny , Windows
Typ Kompilator maszyny stanowej
Licencja
„Ragel 6 pozostaje na licencji GPL v2 [wygenerowany kod] objętej MIT (lub GPL v2)” . Ragel 7: Licencja MIT
Strona internetowa www .colm .net /open source /ragel /

Ragel to kompilator maszyn skończonych i generator parserów . Początkowo Ragel obsługiwał dane wyjściowe dla C , C++ i Assembly i został rozszerzony o obsługę kilku innych języków, w tym Objective C , D , Go , Ruby i Java . Opracowywana jest również dodatkowa obsługa języków. Obsługuje generowanie maszyn stanowych sterowanych tabelą lub przepływem sterowania wyrażenia regularne i/lub wykresy stanu, a także może budować analizatory leksykalne za pomocą metody najdłuższego dopasowania. Ragel jest szczególnie ukierunkowany na parsowanie tekstu i sprawdzanie poprawności danych wejściowych .

Przegląd

Ragel obsługuje generowanie maszyn stanów sterowanych tabelami lub przepływem sterowania z wyrażeń regularnych i/lub wykresów stanów , a także może budować analizatory leksykalne za pomocą metody najdłuższego dopasowania. Unikalną cechą Ragel jest to, że działania użytkownika mogą być powiązane z dowolnymi przejściami maszyny stanów za pomocą operatorów zintegrowanych z wyrażeniami regularnymi. Ragel obsługuje również wizualizację wygenerowanej maszyny za pomocą graphviz .

Visualisierung Ragel.png

Powyższy wykres przedstawia maszynę stanu, która przyjmuje dane wejściowe użytkownika jako serię bajtów reprezentujących znaki ASCII i kody kontrolne. 48..57 jest odpowiednikiem wyrażenia regularnego [0-9] (tj. dowolna cyfra), więc rozpoznane mogą być tylko sekwencje zaczynające się od cyfry. Jeśli napotkamy 10 (przesunięcie wiersza), to koniec. 46 to przecinek dziesiętny („.”), 43 i 45 to znaki dodatnie i ujemne („+”, „-”), a 69/101 to wielka/mała litera „e” (aby wskazać liczbę w formacie naukowym). W związku z tym poprawnie rozpozna następujące elementy:

2 45 055 78,1 2e5 78,3e12 69,0e-3 3e+3

ale nie:

.3 46. -5 3.e2 2e5.1

Składnia

Wejście Ragela jest wyrażeniem regularnym tylko w tym sensie, że opisuje język regularny ; zwykle nie jest zapisany zwięzłym wyrażeniem regularnym, ale podzielony na wiele części, jak w rozszerzonej formie Backus – Naur . Na przykład, zamiast obsługi klas znaków POSIX w składni wyrażeń regularnych, Ragel implementuje je jako wbudowane reguły produkcyjne. Podobnie jak w przypadku zwykłych generatorów parserów, Ragel pozwala na pisanie kodu dla produkcji za pomocą składni. Kod dający powyższy przykład z oficjalnej strony internetowej to:

       
       
       
  
    


  
        akcja  dgt  {  printf("DGT: %c\n", fc);  }  akcja  dec  {  printf("DEC: .\n");  }  akcja  exp  {  printf("EXP: %c\n", fc);  }  akcja  exp_sign  {  printf("SGN: %c\n", fc);  }  numer  akcji  {  /*LICZBA*/  }  # Literał liczby zmiennoprzecinkowej.  liczba  =  (  [0-9]  +  $  dgt  (  '.'     
            
 

      @  dec  [0-9]  +  $  dgt  )?  (  [eE]  (  [+\-]  $  exp_sign  )?  [0-9]  +  $  exp  )?  )  liczba  %  ;  główny  :=  (  liczba  '\n'  )*  ; 

Zobacz też

Linki zewnętrzne