Wat is Syntactische analyse (parsing)?
Fase van de compiler die controleert of de reeks tokens past bij de grammatica van de taal en de structuur van het programma als een boom opbouwt. Grammaticafouten worden hier gevonden.
Japanse benaming: 構文解析
“Syntactische analyse (parsing)” komt voor in 5 oefenvragen uit 1 onderwerpen, bijv. Compilers.
Vakgebied: Compilers
De plaats van parsing in een compiler
De front-end van een compiler werkt in fasen. Lexicale analyse zet de tekenstroom om in tokens zoals identifiers, getallen en symbolen, en verwijdert witruimte en commentaar. Syntactische analyse, of parsing, controleert vervolgens of die reeks tokens volgens de grammatica van de taal een geldig programma vormt en legt vast hoe de onderdelen genest zijn: welke statements de body van een lus vormen, welke operanden bij welke operator horen. Fouten zoals een ontbrekende puntkomma of ongebalanceerde haakjes worden hier gemeld. Daarna volgt semantische analyse, die types controleert en nagaat of namen zijn gedeclareerd, voordat het programma wordt omgezet naar een tussenrepresentatie voor optimalisatie en codegeneratie.
Waarom contextvrije grammatica's nodig zijn
Regels voor tokens zijn eenvoudig genoeg voor reguliere expressies en snelle eindige automaten, maar programmastructuur is dat niet. Geneste haakjes en if-statements binnen if-statements vragen om tellen tot onbeperkte diepte, wat geen reguliere expressie kan. Programmeertalen worden daarom beschreven met contextvrije grammatica's, verzamelingen herschrijfregels zoals expr → expr + term, vaak genoteerd in Backus-Naurvorm. Een goed ontworpen grammatica legt ook operatorprioriteit en associativiteit vast, zodat in a + b * c de vermenigvuldiging eerst wordt gegroepeerd. Ambigue grammatica's, waarbij één invoer twee mogelijke bomen heeft, moeten worden vermeden of met extra regels worden opgelost.
Veelgestelde vragen
Wat is het verschil tussen lexicale analyse en syntactische analyse?
Lexicale analyse splitst brontekst in tokens en verwijdert witruimte en commentaar. Syntactische analyse neemt die tokens, toetst ze aan de grammatica en bouwt een boom die de programmastructuur beschrijft.
Wat is een abstract syntax tree?
Een abstract syntax tree is een boomweergave van een programma die alleen de bewerkingen en statements bewaart die voor de betekenis nodig zijn. Groeperingssymbolen zoals haakjes vallen weg, omdat de vorm van de boom zelf prioriteit en nesting uitdrukt.
Wat is het verschil tussen LL- en LR-parsers?
LL-parsers bouwen de boom top-down en voorspellen regels op basis van komende tokens; handgeschreven recursive-descent-parsers horen hierbij. LR-parsers bouwen bottom-up door tokens op een stack te schuiven en ze tot regels te reduceren, en accepteren een bredere klasse grammatica's.