release , een vrije generator voor lexicale analyse voor de programmeertalen C en C++. Ter herinnering, re2c werd in 1993 geschreven door Peter Bambilius als een experimentele generator voor zeer snelle lexicale analyzers, die zich onderscheidt van andere generators door de snelheid van de gegenereerde code en een ongewoon flexibele gebruikersinterface, die het eenvoudig en efficiënt maakt om analyzers in bestaande codebases te integreren. Sindsdien wordt het project ontwikkeld door de gemeenschap en blijft het een platform voor experimenten en onderzoek op het gebied van formele grammatica's en eindige automaten.
De voorbereiding van de release heeft bijna een jaar geduurd. De meeste tijd ging, zoals altijd, naar de ontwikkeling van de theoretische basis en het schrijven van
het artikel “«.
De algoritmes die in het artikel worden beschreven, zijn geïmplementeerd in de experimentele bibliotheek libre2c
(de bouw van de bibliotheek en de prestatietests zijn standaard uitgeschakeld en kunnen worden ingeschakeld met de configure-optie “--enable-libs”). De bibliotheek is niet bedoeld als concurrent van al bestaande projecten, zoals RE2, maar als een onderzoeksplatform voor de ontwikkeling van nieuwe
algoritmes (die later kunnen worden gebruikt in re2c of in andere projecten). Dit is ook handig voor het testen, prestatiebepaling en het maken van bindings naar andere talen.
De belangrijkste vernieuwingen in versie re2c 1.2:
- Er is een nieuwe vereenvoudigde manier toegevoegd om het einde van de invoergegevens te controleren (“EOF rule”). Hiervoor is de configuratie “re2c:eof” toegevoegd,
die het mogelijk maakt om het terminale teken te kiezen,
en een speciale regel “$”, die in werking treedt als de lexer
met succes het einde van de invoergegevens heeft bereikt.
Historisch gezien biedt re2c verschillende manieren om te controleren op
het einde van de invoergegevens, variërend in beperkingen, efficiëntie en eenvoud
van toepassing. De nieuwe manier is bedoeld om het schrijven van code te vereenvoudigen, terwijl het
efficiënt en breed toepasbaar blijft. De oude manieren
werken nog steeds en kunnen in sommige gevallen de voorkeur genieten. - Er is een mogelijkheid toegevoegd om externe bestanden in te voegen met behulp van de directive
“/*!include:re2c “file.re” */”, waarbij “file.re” de naam is van het in te voegen bestand. Re2c zoekt bestanden in de directory van het invoegde bestand,
en ook in de lijst van paden die zijn opgegeven met de optie “-I”.
Ingevoegde bestanden kunnen andere bestanden insluiten.
Re2c levert 'standaard' bestanden in de directory 'include/'
van het project — het wordt verwacht dat daar nuttige definities worden verzameld
van reguliere expressies, iets in de geest van een standaard bibliotheek.
Tot nu toe is er op verzoek van gebruikers een bestand toegevoegd met definities voor Unicode-categorieën. - Er is nu een mogelijkheid toegevoegd om headerbestanden met willekeurige
inhoud te genereren met de opties '-t --type-header' (of de bijbehorende
configuraties) en nieuwe richtlijnen '/*!header:re2c:on*/' en
'/*!header:re2c:off*/'. Dit kan nuttig zijn in gevallen waarin
re2c definities van variabelen, structuren en macro's moet genereren,
die in andere vertaal eenheden worden gebruikt. - Re2c begrijpt nu UTF8-literals en tekenklassen in reguliere expressies.
Standaard parseert re2c uitdrukkingen zoals '∀x ∃y' als
een reeks van 1-bits ASCII-tekens 'e2 88 80 78 20 e2 88 83 79'
(hex-codes), en gebruikers moeten Unicode-tekens handmatig ontsnappen:
'\\u2200x \\u2203y'. Dit is erg ongemakkelijk en onverwacht voor veel
gebruikers (zoals blijkt uit constante bugrapports). Daarom
biedt re2c nu de optie '--input-encoding {ascii | utf8}',
die het gedrag verandert en '∀x ∃y' kan parseren als
'2200 78 20 2203 79'. - Re2c staat nu het gebruik van normale re2c-blokken toe in modus '-r --reuse'.
Dit is handig als het invoerbestand veel blokken bevat, en slechts een deel ervan
hergebruikt hoeft te worden. - Er is een mogelijkheid toegevoegd om het formaat van waarschuwingen en foutmeldingen
in te stellen met de nieuwe optie '--location-format {gnu | msvc}'. Het GNU-formaat wordt weergegeven
als 'bestandsnaam:regel:kolom:', en het MSVC-formaat als 'bestandsnaam(regel,koloom)'.
Deze functie kan handig zijn voor IDE-fans.
Er is ook een optie '--verbose' toegevoegd die een kort bevestigingsbericht weergeeft bij succes. - De 'compatibiliteitsmodus' met flex is verbeterd — sommige parsingfouten en
onjuiste prioriteiten van operatoren zijn in zeldzame gevallen gecorrigeerd.
Historisch gezien staat de optie '-F --flex-support' toe om code
in mengvorm in flex-stijl en re2c-stijl te schrijven, wat de syntactische parsing enigszins bemoeilijkt.
De compatibiliteitsmodus met flex wordt zelden gebruikt in nieuwe code,
maar re2c blijft het ondersteunen voor achterwaartse compatibiliteit. - De operator voor het aftrekken van tekenklassen '/' wordt nu toegepast
voor het uitpakken van de codering, wat het mogelijk maakt om het in een groter aantal gevallen toe te passen,
indien een codering met variabele tekenlengte wordt gebruikt (bijvoorbeeld UTF8). - Het uitvoerbestand wordt nu atomair aangemaakt: re2c maakt eerst een tijdelijk bestand aan
en schrijft de resultaten daarin, waarna het tijdelijke bestand wordt hernoemd naar de uitvoer
in één bewerking. - De documentatie is aangevuld en herschreven; in het bijzonder zijn nieuwe
hoofdstukken toegevoegd over
en .
De nieuwe documentatie is verzameld in de vorm van
met voorbeelden (dezelfde bronbestanden worden weergegeven in manpage en in de online documentatie).
Er zijn zwakke pogingen gedaan om de leesbaarheid van de site op telefoons te verbeteren. - Vanuit het perspectief van ontwikkelaars heeft re2c een meer volledige debug-subsysteem gekregen.
De debugcode is nu uitgeschakeld in de release-builds en
kan worden ingeschakeld met de configure-optie «—enable-debug».
Bron: opennet.ru
