Wydanie generatora analizatora leksykalnego re2c 1.2
Odbyła się wydanie re2c, darmowy generator analizatorów leksykalnych dla języków C i C++. Przypomnijmy, że re2c został napisany w 1993 roku przez Petera Bambulisa jako eksperymentalny generator bardzo szybkich analizatorów leksykalnych, różniący się od innych generatorów szybkością generowanego kodu i niezwykle elastycznym interfejsem użytkownika, który pozwala na łatwą i wydajną integrację analizatorów z istniejącym kodem baza. 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.
Przygotowania do wydania trwały niemal cały rok. Większość czasu, jak zawsze, poświęcono na opracowanie podstaw teoretycznych i pisanie
artykuły”Wydajna ekstrakcja poddopasowań POSIX w NFA".
Algorytmy opisane w artykule zaimplementowano w eksperymentalnej bibliotece libre2c
(budowanie biblioteki i testy wydajności są domyślnie wyłączone i włączane poprzez opcję konfiguracji „—enable-libs”). Biblioteka nie ma być konkurentem 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, pomiaru wydajności i tworzenia powiązań z innymi językami.
Główne innowacje w wersji re2c 1.2:
Dodano nową uproszczoną metodę sprawdzania końca danych wejściowych („reguła EOF”). W tym celu dodana została konfiguracja „re2c:eof”,
pozwala wybrać znak terminala,
oraz specjalna reguła „$”, która jest wyzwalana, 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 "file.re" */", gdzie "file.re" to nazwa pliku, który ma zostać dołączony. Re2c szuka plików w katalogu zawierającym pliki,
a także 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
ciąg 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 {ascii | utf8}",
co pozwala zmienić zachowanie i przeanalizować „∀x ∃y” jako
„2200 78 20 2203 79.”
Re2c umożliwia teraz używanie 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 {gnu | msvc}”. Wyświetlany jest format GNU
jako „nazwa pliku: linia: kolumna:”, a 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-suppor” 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”.