Wydanie generatora analizatorów leksykalnych re2c 1.2

Zdarzyło się wydanie re2c, wolnego generatora analizatorów leksykalnych dla języków C i C++. Przypominamy, że re2c został napisany w 1993 roku przez Petera Bamboulisa jako eksperymentalny generator bardzo szybkich analizatorów leksykalnych, różniący się od innych generatorów szybkością generowanego kodu oraz niezwykle elastycznym interfejsem użytkownika, który umożliwia łatwe i skuteczne wkomponowanie analizatorów w istniejącą bazę kodu. Od tego czasu projekt rozwija się w ramach społeczności i wciąż pozostaje platformą do eksperymentów i badań w dziedzinie gramatyk formalnych i automatów skończonych.

Przygotowanie wydania zajęło prawie cały rok. Większość czasu, jak zwykle, poświęcono na opracowanie bazy teoretycznej i napisanie
artykuły «Efficient POSIX Submatch Extraction on NFA«.
Algorytmy opisane w artykule są zaimplementowane w eksperymentalnej bibliotece libre2c
(kompilacja biblioteki i testów wydajności została wyłączona domyślnie i włączona opcją configure «—enable-libs»). Biblioteka nie jest myślana jako konkurencja dla istniejących projektów, takich jak RE2, lecz jako platforma badawcza do opracowywania nowych
algorytmów (które mogą być następnie wykorzystane w re2c lub w innych projektach). To również ułatwia testowanie, pomiar wydajności oraz tworzenie bindów do innych języków.

Główne nowości w wersji re2c 1.2:

  • Dodano nowy uproszczony sposób sprawdzania końca danych wejściowych («EOF rule»). W tym celu dodano konfigurację «re2c:eof»,
    umożliwiającą wybór symbolu terminalnego,
    i specjalna reguła «$», która uruchamia się, gdy leksykalna
    pomyślnie osiągnie koniec danych wejściowych.
    Historycznie re2c oferuje do wyboru kilka metod weryfikacji końca
    danych wejściowych, różniących się ograniczeniem, wydajnością i prostotą
    zastosowania. Nowa metoda ma na celu uproszczenie pisania kodu, pozostając przy tym
    wydajna i szeroko stosowalna. Stare metody
    wciąż działają i mogą być preferowane w niektórych przypadkach.
  • Dodano możliwość dołączania zewnętrznych plików za pomocą dyrektywy
    « /*!include:re2c «file.re» */», gdzie «file.re» to nazwa dołączanego pliku. Re2c szuka plików w katalogu dołączającego pliku,
    a także na liście ścieżek określonych za pomocą opcji «-I».
    Włączone pliki mogą zawierać inne pliki.
    Re2c dostarcza «standardowe» pliki w katalogu «include/»
    projektu — zakłada się, że będą tam zbierane przydatne definicje
    wyrażeń regularnych, coś w stylu standardowej biblioteki.
    Jak na razie, na prośby użytkowników, dodano jeden plik z definicjami kategorii Unicode.
  • Dodano możliwość generowania plików nagłówkowych z dowolnym
    zawartością za pomocą opcji «-t —type-header» (lub odpowiadających
    konfiguracji) i nowych dyrektyw « /*!header:re2c:on*/» oraz
    « /*!header:re2c:off*/». Może to być przydatne w przypadkach,
    gdy re2c musi wygenerować definicje zmiennych, struktur i makr,
    używanych w innych jednostkach translacji.
  • Re2c teraz rozumie literały UTF8 i klasy znaków w wyrażeniach regularnych.
    Domyślnie re2c parsuje wyrażenia takie jak «∀x ∃y» jako
    sekwencję 1-bitowych znaków ASCII «e2 88 80 78 20 e2 88 83 79»
    (kody hex), co zmusza użytkowników do ręcznego escape'owania znaków Unicode:
    «\\u2200x \\u2203y». Jest to bardzo niewygodne i nieoczekiwane dla wielu
    użytkowników (o czym świadczą ciągłe zgłoszenia błędów). Dlatego teraz
    re2c oferuje opcję «—input-encoding {ascii | utf8}»,
    która pozwala zmienić zachowanie i zinterpretować «∀x ∃y» jako
    «2200 78 20 2203 79».
  • Re2c teraz pozwala na użycie zwykłych bloków re2c w trybie «-r —reuse».
    To jest wygodne, jeśli plik wejściowy zawiera wiele bloków, a tylko część z nich
    wymaga ponownego użycia.
  • Pojawiła się możliwość ustawiania formatu ostrzeżeń i komunikatów o błędach
    dzięki nowej opcji «—location-format {gnu | msvc}». Format GNU wyświetlany jest
    jako «filename:line:column:», a format MSVC — jako «filename(line,column)».
    Ta możliwość może być przydatna dla miłośników IDE.
    Dodano również opcję «—verbose», która wyświetla krótką wiadomość o sukcesie w przypadku powodzenia.
  • Udoskonalono tryb «kompatybilności» z flex — poprawiono niektóre błędy analizy oraz
    niepoprawny priorytet operatorów w rzadkich przypadkach.
    Historycznie opcja «-F —flex-support» pozwala na pisanie kodu
    w stylu flex i w stylu re2c, co trochę utrudnia analizę składni.
    Tryb kompatybilności z flex rzadko jest używany w nowym kodzie,
    jednakże re2c wciąż go wspiera dla kompatybilności wstecznej.
  • Operator odejmowania klas znaków «/» jest teraz stosowany
    do rozwijania kodowania, co pozwala na jego zastosowanie w większej liczbie przypadków,
    jeśli jest używane kodowanie o zmiennej długości znaku (np. UTF8).
  • Plik wyjściowy jest teraz tworzony atomowo: re2c najpierw tworzy plik tymczasowy
    i zapisuje w nim wynik, a następnie zmienia nazwę pliku tymczasowego na wyjściowy
    jedną operacją.
  • Dokumentacja została dopisana i przepisana; w szczególności dodano nowe
    rozdziały dotyczące http://re2c.org/manual/manual.html#buffer-refilling napełniania bufora
    i w zakresie sposobów sprawdzania końca danych wejściowych..
    Nowa dokumentacja została zebrana w formie
    wyczerpującego jednolitych przewodnika
    z przykładami (te same źródła są renderowane w manpage i w dokumentacji online).
    Podjęto słabe próby poprawy czytelności strony na telefonach.
  • Z punktu widzenia programistów, re2c zyskał pełniejszy system
    debugowania. Kod debugowania jest teraz wyłączony w wersjach produkcyjnych i
    może być włączony za pomocą opcji configure «—enable-debug».

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster