wydanie , 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 ««.
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
i .
Nowa dokumentacja została zebrana w formie
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
