Yacc

Yacc
Ontwerp en ontwikkeling
Categorie Parsergenerator
Ontwikkelaar(s) Stephen C. Johnson
Besturings­systeem Unix
Geschreven in CBewerken op Wikidata
Status en tijdlijn
Uitgebracht 1970
Vervangen door GNU bison, Berkeley YaccBewerken op Wikidata
Onderdelen
Licentie(s) onbekend
Links
Website (en) YACC Manual
Versiebeheer Broncode
Portaal  Portaalicoon   Informatica

Yacc is een parsergenerator die door Stephen C. Johnson bij AT&T werd ontwikkeld voor het besturingssysteem Unix. De naam is een acroniem voor Yet Another Compiler-Compiler. Het programma genereert een parser in de programmeertaal C op basis van een beschrijving van de grammaticale structuur van de te verwerken invoer. Zo'n parser kan bijvoorbeeld in een compiler worden gebruikt om de structuur van een programma te herkennen.

Werking

De gebruiker beschrijft de grammatica in een notatie die lijkt op het Backus-Naur-formalisme. Aan de grammaticaregels kan C-code worden toegevoegd die wordt uitgevoerd wanneer de parser de bijbehorende structuur herkent. Deze code kan bijvoorbeeld een syntaxisboom opbouwen of de waarde van een rekenkundige uitdrukking berekenen. De gegenereerde parser gebruikt het LALR(1)-algoritme, waarbij hoogstens één volgend invoertoken nodig is om de volgende stap te bepalen.

De parser ontvangt zijn invoer van een afzonderlijke lexicale analyser. Deze leest de invoertekst en herkent daarin tokens, zoals namen, getallen en operatoren. De parser bepaalt vervolgens hoe die tokens volgens de grammaticaregels samenhangen. De lexicale analyser kan met de hand worden geschreven of worden gegenereerd met een programma zoals Lex of Flex. Yacc en Lex zijn ontworpen om samen te werken.

De functionaliteit en vereisten van Yacc zijn vastgelegd in de POSIX-standaard. Deze beschrijft onder meer de invoertaal, de te genereren C-code en de koppeling tussen de parser en de lexicale analyser.

Varianten

Naast de oorspronkelijke versie zijn verschillende compatibele parsergeneratoren ontwikkeld, waaronder Berkeley Yacc, GNU Bison, MKS Yacc en PCYACC van Abraxas. Berkeley Yacc werd ontwikkeld met het doel zo goed mogelijk verenigbaar te zijn met de oorspronkelijke AT&T-versie. Andere implementaties bieden aanvullende mogelijkheden; zo kan MKS Yacc naast C ook C++-code genereren.

Een van de oorspronkelijke Unix-versie afgeleide uitvoering werd door Sun vrijgegeven als onderdeel van OpenSolaris. Hierop zijn de versies van Yacc en Lex in het pakket Heirloom Development Tools gebaseerd.

Er bestaan ook op Yacc gebaseerde of daarop geïnspireerde parsergeneratoren voor andere programmeertalen. Voorbeelden zijn Ayacc voor Ada en BYACC/J, een uitbreiding van Berkeley Yacc die parsers voor Java kan genereren.