Lug 0.5.0

Lug 0.5.0

19. března byla vydána C++ knihovna Lug, která implementuje vestavěný doménově orientovaný jazyk pro vyjádření syntaktických analyzátorů ve formě rozšířených gramatik syntaktických výrazů, a je distribučně spravována pod licencí MIT.

Funkce knihovny:

  • Přirozená syntaxe, připomínající jazyky externích generátorů parserů, s podporou atributů a sémantických akcí.
  • Možnost práce s kontextově závislými gramatikami s tabulkami symbolů, podmínkami a syntaktickými predikáty.
  • Generované analyzátory se kompilují do bytecode a vykonávají se ve virtuální stroji pro syntaktickou analýzu.
  • Jasné oddělení syntaktických a lexikálních pravidel s možností přizpůsobení implicitního přeskočení bílých znaků.
  • Podpora přímé a nepřímé levé rekurze, s prioritními úrovněmi pro oddělení podvýrazů se smíšenou levou a pravou rekurzí.
  • Plná podpora analýzy textu ve formátu UTF-8, včetně úrovně 1 a částečné shody s úrovní 2 technického standardu UTS #18 Unicode Regular Expressions.
  • Zpracování chyb a obnovování pomocí označených selhání, pravidel obnovování a zpracovatelů chyb.
  • Automatické sledování čísel řádků a sloupců, přizpůsobitelná šířka a zarovnání tabulátorů.
  • Header-only knihovna, využívající pouze standardní knihovnu a možnosti standardu C++17. Perspektivně kompatibilní se standardy C++20 a C++23.
  • Relativně malá velikost knihovny, s cílem udržet celkový počet řádků ve všech hlavičkových souborech pod úrovní 6000 řádků jasného kódu.

Seznam změn:

  • Realizovány direktivy kolekcí a atributů objektů. Nová direktiva collect<C>[e] syntetizuje sekvenci nebo asociativní kontejner typu C, skládající se z prvků, sesbíraných z dědičných nebo syntetizovaných atributů ve výrazu e. Podobně, objevily se nové direktivy synthesize<C,A…>[e], synthesize_shared<C,A…>[e] a synthesize_unique<C,A…>[e] pro syntézu objektů, sdílených a unikátních ukazatelů, postavených z atributů komponentů ve výrazu e.
  • Byla implementována direktiva synthesize_collect, která kombinuje direktivy collect a synthesize pro zlepšení čitelnosti kódu a snížení počtu šablon při vytváření složitých datových struktur z rozložených prvků. To je zvláště užitečné pro vytváření vnořených kolekcí, jako jsou pole objektů nebo asociativní kontejnery se složitými typy hodnot.
  • Byla přidána šablonová třída lug::recursive_wrapper pro zpracování cyklických závislostí v stromech abstraktního syntaktického analyzátoru, zejména těch, které používají std::variant.
  • Byla implementována podpora standardu Unicode 16.0.0 a přidána podpora nástrojů sestavení v CMakeLists.txt.
  • Bylo optimalizováno porovnávání rozsahu a sady ASCII znaků, což vedlo k výraznému zvýšení výkonu při provádění běžných operací zpracování textu. Byly přidány specializované rychlé metody pro zpracování pouze ASCII znaků, které jsou mnohem rychlejší než kód pro zpracování Unicode.
  • Byly implementovány opkódy test pro optimalizaci chyb a opkódy repeat pro optimalizaci přeskočení bílých znaků. Tyto optimalizace budou plně zahrnuty v příštím vydání po naplánovaných transformacích stromu výrazů.
  • Bylo zlepšeno zpracování vstupních zdrojů s vylepšeným vyrovnáváním a reportingem chyb pro std::istream, a byla také vylepšena podpora interaktivního režimu, která správně zpracovává řádkový vstup pro terminálové relace nebo pro lineárně orientované gramatiky.
  • Podpora std::istream byla přesunuta do samostatného hlavičkového souboru . To zkracuje čas kompilace a minimalizuje závislosti na hlavičkových souborech pro projekty, které nepotřebují funkčnost proudového vstupu/výstupu.
  • Logika fixace parseru byla přepracována inliningem instrukcí do lug::basic_parser pro lepší kompatibilitu se změnami architektury zásobníkového rámce, které byly představeny ve verzi 0.4.0, což zlepšilo organizaci kódu a výkon.
  • Byl opraven problém v příkladu parseru BASIC, když uživatelské funkce (např. FNA(X)) skončily během vyhodnocení. To bylo způsobeno změnami ve verzi 0.4.0, které resetovaly lug::environment během vnořených operací syntaktické analýzy. Byla přidána nová funkce lug::environment::should_reset_on_parse pro zajištění jemné kontroly nad tímto chováním, což umožňuje prostředí uchovat se během vnořených operací analýzy, když je to nutné.
  • Byla přidána komplexní infrastruktura pro testování příkladů programů.
  • Byla přestavěna hierarchie adresářů include.
  • Pro širší kompatibilitu v GitHub CI byla přidána podpora dalších kompilátorů (GCC 9/10/11/12, Clang 14/15/16/17).
  • Do GitHub CI byly přidány statické analyzátory Clang a MSVC.
  • Do GitHub CI byly přidány Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) a Memory Sanitizer (MSan).
  • Do GitHub CI byla přidána integrace clang-tidy.
  • Z GitHub CI bylo odstraněno použití Ubuntu 20.04.

Zdroj: linux.org.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster