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.

  • Dokumentacja została uzupełniona i przepisana; w szczególności dodano nowe
    rozdziały o http://re2c.org/manual/manual.html#buffer-refilling заполнение буфера
    и o sposobach sprawdzania końca danych wejściowych.
    Nowa dokumentacja jest gromadzona w formularzu
    kompleksowy, jednostronicowy przewodnik
    z przykładami (te same źródła są renderowane na stronie podręcznika i w dokumentacji online).
    Podejmowano słabe próby poprawy czytelności witryny na telefonach.

  • 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”.

Źródło: opennet.ru

Dodaj komentarz