W piątek 2 sierpnia wydano re2c — wolny generator analizatorów leksykalnych dla języków C i C++. Przypominamy, że re2c został napisany w 1993 roku przez Pietera Bambulisa jako eksperymentalny generator bardzo szybkich analizatorów leksykalnych, który różni się od innych generatorów szybkością generowanego kodu oraz niezwykle elastycznym interfejsem użytkownika, który pozwala łatwo i efektywnie integrować analizatory w istniejącą bazę kodu. Od tego czasu projekt rozwija się w społeczności i nadal pozostaje miejscem eksperymentów i badań w zakresie formalnych gramatyk i automatów skończonych.
Główne nowości w wersji 1.2:
Dodano nowy (uproszczony) sposób weryfikacji końca danych wejściowych
(ang. „EOF rule”).
W tym celu dodano konfigurację re2c:eof,
umożliwiającą wybór symbolu terminalnego,
oraz specjalna reguła $, która działa, jeśli lexer
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" */, где file.re
to nazwa pliku dołączanego. Re2c szuka plików w katalogu pliku dołączanego,
a także na liście ścieżek podanych 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) oraz nowych dyrektyw \*!header:re2c:on*/ i
/*!header:re2c:off*/. Это может быть полезно в случаях,
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 analizuje wyrażenia takie jak "∀x ∃y" jako.
ciąg 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 dostarcza opcję —input-encoding ,
która pozwala zmienić zachowanie i przeanalizować "∀x ∃y" jako
2200 78 20 2203 79.Re2c teraz pozwala na używanie 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
z nową opcją —location-format . Format GNU jest wyświetlany
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ą sukcesywną wiadomość w przypadku powodzenia.Zmodernizowano tryb „kompatybilności” z flex — naprawiono niektóre błędy analizy oraz
niepoprawny priorytet operatorów w rzadkich przypadkach.
Historycznie opcja -F —flex-support pozwala 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 / teraz stosuje się
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
i w zakresie sposobów sprawdzania końca danych wejściowych..
Nowa dokumentacja została zebrana w formie
wyczerpującego jednopłatkowego podręcznika
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 konfiguracyjnej —enable-debug.
Ta wersja zajęła dużo czasu — prawie rok.
Większość czasu, jak zawsze, poświęcono na opracowanie podstawy teoretycznej i napisanie
artykułu „Efficient POSIX Submatch Extraction on NFA”.
Algorytmy opisane w artykule są zaimplementowane w eksperymentalnej bibliotece libre2c
(domyślnie wyłączone zbiory biblioteki i benchmarków są włączane przez opcję configure —enable-libs). Biblioteka nie jest zaprojektowana jako konkurencja dla istniejących
projektów, takich jak RE2, lecz jako platforma badawcza do rozwoju nowych
algorytmów (które później mogą być wykorzystywane w re2c lub innych projektach).
Jest to również wygodne z punktu widzenia testowania, benchmarków i tworzenia bindingów do innych języków.
Dziękujemy od twórców re2c wszystkim, którzy przyczynili się do powstania tej wersji,
a także całej społeczności za pomysły, raporty o błędach, poprawki, ducha walki itd.;]
W piątek 2 sierpnia wydano wersję re2c — wolnego generatora analizatorów leksykalnych dla języków C i C++.
Źródło: linux.org.ru
