W piątek 2 sierpnia ukazała się premiera re2c, darmowego generatora analizatorów leksykalnych dla języków C i C++. Re2c został napisany w 1993 roku przez Petera Bamboulisa jako eksperymentalny generator bardzo szybkich analizatorów leksykalnych, odróżniający się od innych generatorów szybkością generowanego kodu i niezwykle elastycznym interfejsem użytkownika, który umożliwia łatwe i wydajne osadzanie analizatorów w istniejącej bazie kodu. Od tego czasu projekt jest rozwijany przez społeczność i nadal stanowi platformę do eksperymentów i badań w dziedzinie gramatyk formalnych i maszyn skończonych.
Główne innowacje w wersji 1.2:
Dodano nowy (uproszczony) sposób sprawdzania końca danych wejściowych
(angielski „reguła EOF”).
W tym celu dodana została konfiguracja re2c:eof,
pozwala wybrać znak terminala,
oraz specjalna reguła $, która uruchamia się, jeśli lekser
pomyślnie dotarł do końca danych wejściowych.
Historycznie rzecz biorąc, re2c zapewnia wybór kilku metod weryfikacji
koniec nakładów różniących się ograniczeniami, wydajnością i prostotą
Aplikacje. Nowa metoda ma na celu uproszczenie pisania kodu, natomiast
pozostając jednocześnie skutecznymi i szeroko stosowanymi. Stare sposoby
nadal działa i w niektórych przypadkach może być preferowany.
Dodano możliwość dołączania plików zewnętrznych za pomocą dyrektywy
/*!include:re2c "plik.re" */ gdzie plik.re
to jest nazwa pliku dołączanego. Re2c szuka plików w katalogu zawierającym pliki,
jak również na liście ścieżek określonych opcją -I.
Dołączone pliki mogą zawierać inne pliki.
Re2c udostępnia „standardowe” pliki w katalogu include/
projektu – oczekuje się, że zgromadzą się w nim przydatne definicje
wyrażenia regularne, coś w rodzaju biblioteki standardowej.
Póki co na prośbę pracowników dodany został jeden plik z definicjami kategorii Unicode.
Dodano możliwość generowania plików nagłówkowych z dowolnymi plikami nagłówkowymi
zawartość za pomocą opcji -t --type-header (lub odpowiedniego
konfiguracje) i nowe dyrektywy /*!header:re2c:on*/ i
/*!header:re2c:off*/. Może to być przydatne w przypadkach, gdy
gdy re2c potrzebuje wygenerować definicje zmiennych, struktur i makr,
używane w innych jednostkach tłumaczeniowych.
Re2c rozumie teraz literały UTF8 i klasy znaków w wyrażeniach regularnych.
Domyślnie re2c analizuje wyrażenia takie jak „∀x ∃y” jako.
sekwencja 1-bitowych znaków ASCII e2 88 80 78 20 e2 88 83 79
(kody szesnastkowe), a użytkownicy muszą ręcznie zmieniać znaki Unicode:
„u2200x u2203y”. Dla wielu jest to bardzo niewygodne i nieoczekiwane
użytkowników (o czym świadczą ciągłe raporty o błędach). Więc teraz
re2c udostępnia opcję --input-encoding ,
co pozwala zmienić zachowanie i przeanalizować „∀x ∃y” jako
2200 78 20 2203 79.
Re2c pozwala teraz na użycie zwykłych bloków re2c w trybie -r --reuse.
Jest to wygodne, jeśli plik wejściowy zawiera wiele bloków i tylko niektóre z nich
musi zostać ponownie użyty.
Teraz możesz ustawić format ostrzeżeń i komunikatów o błędach
używając nowej opcji --location-format . Wyświetlany jest format GNU
jako nazwa pliku:linia:kolumna: i format MSVC jako nazwa pliku(linia,kolumna).
Ta funkcja może być przydatna dla miłośników IDE.
Dodano także opcję --verbose, która w przypadku powodzenia wyświetla krótką wiadomość o zwycięstwie.
Ulepszono tryb „kompatybilności” z flexem – naprawiono niektóre błędy analizy i
w rzadkich przypadkach nieprawidłowe pierwszeństwo operatora.
Historycznie rzecz biorąc, opcja -F --flex-support umożliwiała pisanie kodu
zmieszane w stylu flex i stylu re2c, co sprawia, że parsowanie jest trochę trudne.
Tryb zgodności Flex jest rzadko używany w nowym kodzie,
ale re2c nadal obsługuje go w celu zapewnienia kompatybilności wstecznej.
Obowiązuje teraz operator odejmowania klasy znaków /
przed rozszerzeniem kodowania, co pozwala na jego wykorzystanie w większej liczbie przypadków,
jeśli używane jest kodowanie o zmiennej długości znaków (na przykład UTF8).
Plik wyjściowy jest teraz tworzony niepodzielnie: re2c tworzy najpierw plik tymczasowy
i zapisuje w nim wynik, a następnie zmienia nazwę pliku tymczasowego na wynik
jedna operacja.
Z punktu widzenia deweloperów re2c zyskał bardziej kompletny podsystem
debugowanie Kod debugowania jest teraz wyłączony w kompilacjach wydań i
można włączyć za pomocą opcji konfiguracyjnej --enable-debug.
To wydanie zajęło dużo czasu – prawie cały rok.
Większość czasu, jak zawsze, poświęcono na opracowanie podstaw teoretycznych i pisanie
Artykuł „Efektywna ekstrakcja poddopasowań POSIX w NFA”.
Algorytmy opisane w artykule zaimplementowano w eksperymentalnej bibliotece libre2c
(budowanie biblioteki i testów porównawczych jest domyślnie wyłączone i włączane za pomocą opcji konfiguracji
--enable-libs). Biblioteka nie jest pomyślana jako konkurencja dla istniejących
projektów takich jak RE2, ale jako platforma badawcza do opracowywania nowych
algorytmy (które można następnie wykorzystać w re2c lub w innych projektach).
Jest to również wygodne z punktu widzenia testowania, benchmarków i tworzenia powiązań z innymi językami.
Podziękowania od programistów re2c dla wszystkich, którzy pomogli w powstaniu tego wydania,
oraz ogólnie społeczności w celu uzyskania pomysłów, raportów o błędach, poprawek, morale itp. ;]