Wat is syntaxisanalyse?
Syntaxisanalyse is een tweede fase van het compilerontwerpproces waarin de gegeven invoerstring wordt gecontroleerd op de bevestiging van regels en structuur van de formele grammatica. Het analyseert de syntactische structuur en controleert of de gegeven invoer in de juiste syntaxis van de programmeertaal staat of niet.
Syntaxisanalyse in het Compiler-ontwerpproces komt na de Lexicale analysefase. Het is ook bekend als de Parse Tree of Syntax Tree. De Parse Tree is ontwikkeld met behulp van vooraf gedefinieerde grammatica van de taal. De syntaxisanalysator controleert ook of een bepaald programma voldoet aan de regels die worden geïmpliceerd door een contextvrije grammatica. Als het voldoet, maakt de parser de ontleedboom van dat bronprogramma aan. Anders worden er foutmeldingen weergegeven.
In deze tutorial leer je
- Waarom heb je Syntax Analyzer nodig?
- Belangrijke terminologie van de syntaxisanalyse
- Waarom hebben we parsing nodig?
- Parseringstechnieken
- Fout - Herstelmethoden
- Grammatica:
- Notationele conventies
- Contextvrije grammatica
- Grammatica Afleiding
- Syntaxis versus Lexical Analyzer
- Nadelen van het gebruik van Syntax Analyzers
Waarom heb je Syntax Analyzer nodig?
- Controleer of de code grammaticaal geldig is
- De syntactische analysator helpt u regels op de code toe te passen
- Helpt u ervoor te zorgen dat elke openingsbeugel een overeenkomstig eindsaldo heeft
- Elke aangifte heeft een type en dat type moet bestaan
Belangrijke terminologie van de syntaxisanalyse
Belangrijke terminologieën die worden gebruikt in het analyseproces van de syntaxis:
- Zin: een zin is een groep tekens boven een bepaald alfabet.
- Lexeme: een lexeme is de syntactische eenheid op het laagste niveau van een taal (bijv. Totaal, begin).
- Token: een token is slechts een categorie van lexemen.
- Trefwoorden en gereserveerde woorden - Het is een identificatie die wordt gebruikt als een vast onderdeel van de syntaxis van een instructie. Het is een gereserveerd woord dat u niet als variabelenaam of identificator kunt gebruiken.
- Ruiswoorden - Ruiswoorden zijn optioneel en worden in een instructie ingevoegd om de leesbaarheid van de zin te vergroten.
- Opmerkingen - Het is een zeer belangrijk onderdeel van de documentatie. Het wordt meestal weergegeven met, / * * / of // Blank (spaties)
- Scheidingstekens - Het is een syntactisch element dat het begin of einde van een syntactische eenheid markeert. Net als een statement of uitdrukking, "begin"… '' end ", of {}.
- Tekenset - ASCII, Unicode
- Identifiers - Het is een beperking van de lengte die u helpt om de leesbaarheid van de zin te verminderen.
- Operatorsymbolen - + en - voeren twee elementaire rekenkundige bewerkingen uit.
- Syntactische elementen van de taal
Waarom hebben we parsing nodig?
Een parse controleert ook of de invoertekenreeks correct is gevormd, en zo niet, dan wijst deze af.
Hieronder volgen belangrijke taken die door de parser worden uitgevoerd in het ontwerp van de compiler:
- Helpt u bij het detecteren van alle soorten syntaxisfouten
- Zoek de positie waarop de fout is opgetreden
- Duidelijke en nauwkeurige beschrijving van de fout.
- Herstel van een fout om door te gaan en verdere fouten in de code te vinden.
- Heeft geen invloed op de compilatie van "correcte" programma's.
- Het parseren moet ongeldige teksten weigeren door syntaxisfouten te rapporteren
Parseringstechnieken
Parseringstechnieken zijn onderverdeeld in twee verschillende groepen:
- Top-down parseren,
- Bottom-up parseren
Top-down parseren:
Bij het top-down ontleden begint de constructie van de ontleedboom bij de wortel en gaat dan verder naar de bladeren.
Twee soorten Top-down parsing zijn:
- Voorspellend parseren:
Predictive parse kan voorspellen welke productie moet worden gebruikt om de specifieke invoertekenreeks te vervangen. De voorspellende parser gebruikt een vooruitkijkpunt, dat naar de volgende invoersymbolen wijst. Backtracking is geen probleem met deze parseertechniek. Het staat bekend als LL (1) Parser
- Recursive Descent Parsing:
Deze parseertechniek parseert de invoer recursief om een prase-boom te maken. Het bestaat uit verschillende kleine functies, één voor elk niet-terminaal onderdeel in de grammatica.
Bottom-up parseren:
Bij het bottom-up parseren in het compilerontwerp begint de constructie van de ontledingsboom met het verlof, en vervolgens verwerkt het naar zijn root. Het wordt ook wel shift-reduce parsing genoemd. Dit type parsing in compilerontwerp wordt gemaakt met behulp van enkele softwaretools.
Fout - Herstelmethoden
Veelvoorkomende fouten die optreden bij het parseren in systeemsoftware
- Lexical : naam van een onjuist getypte identifier
- Syntactisch : onevenwichtig haakje of een ontbrekende puntkomma
- Semantisch : incompatibele waardetoekenning
- Logisch : oneindige lus en niet bereikbare code
Een parser zou elke fout in het programma moeten kunnen detecteren en rapporteren. Dus als er een fout is opgetreden, wordt de parser. Het zou het moeten aankunnen en door kunnen gaan met het parseren van de resterende invoer. Een programma kan de volgende soorten fouten hebben in verschillende fasen van het compilatieproces. Er zijn vijf veelgebruikte methoden voor foutherstel die in de parser kunnen worden geïmplementeerd
Herstel van verklaringmodus
- In het geval dat de parser een fout tegenkomt, helpt het u bij het nemen van corrigerende maatregelen. Hierdoor kunnen de rest van de ingangen en toestanden vooruit worden geparseerd.
- Het toevoegen van een ontbrekende puntkomma komt bijvoorbeeld in de herstelmethode van de instructiemodus. De ontleder moet echter voorzichtig zijn bij het aanbrengen van deze wijzigingen, aangezien een verkeerde correctie tot een oneindige lus kan leiden.
Herstel in paniekmodus
- In het geval dat de parser een fout tegenkomt, negeert deze modus de rest van de instructie en verwerkt geen invoer van foutieve invoer tot scheidingsteken, zoals een puntkomma. Dit is een eenvoudige methode voor foutherstel.
- Bij dit type herstelmethode verwerpt de parser invoersymbolen één voor één totdat een enkele aangewezen groep synchronisatietokens is gevonden. De synchronisatietokens gebruiken doorgaans scheidingstekens zoals of.
Herstel op zinsniveau:
- Compiler corrigeert het programma door tokens in te voegen of te verwijderen. Hierdoor kan het doorgaan met het ontleden van waar het was. Het voert een correctie uit op de resterende invoer. Het kan een voorvoegsel van de resterende invoer vervangen door een tekenreeks, dit helpt de parser om het proces voort te zetten.
Foutproducties
- Herstel van foutenproductie breidt de grammatica uit voor de taal die de foutieve constructies genereert. De parser voert vervolgens een foutdiagnose uit over dat construct.
Globale correctie:
- De compiler moet zo min mogelijk wijzigingen aanbrengen tijdens het verwerken van een onjuiste invoertekenreeks. Gegeven een onjuiste invoertekenreeks a en grammatica c, zoeken algoritmen naar een ontleedboom voor een gerelateerde tekenreeks b. Zoals sommige invoegingen, verwijderingen en wijzigingen van tokens die nodig zijn om a in b om te zetten, zo min mogelijk is.
Grammatica:
Een grammatica is een reeks structurele regels die een taal beschrijven. Grammatica's geven structuur aan elke zin. Deze term verwijst ook naar de studie van deze regels, en dit bestand bevat morfologie, fonologie en syntaxis. Het is in staat om veel van de syntaxis van programmeertalen te beschrijven.
Regels voor formuliergrammatica
- Het niet-terminalsymbool moet links van de ten minste ene productie verschijnen
- Het doelsymbool mag nooit rechts van de :: = van een productie worden weergegeven
- Een regel is recursief als LHS in zijn RHS voorkomt
Notationele conventies
Symbolen voor notatieconventies kunnen worden aangegeven door het element tussen vierkante haken te plaatsen. Het is een willekeurige reeks instanties van het element die kan worden aangegeven door het element tussen accolades te plaatsen, gevolgd door een asterisk-symbool, {…} *.
Het is een keuze van het alternatief dat het symbool binnen de enkele regel mag gebruiken. Het kan indien nodig tussen haakjes ([,]) worden geplaatst.
Twee soorten notatieconventies zijn Terminal en Non-terminals
1. terminals:
- Kleine letters in het alfabet, zoals a, b, c,
- Operatorsymbolen zoals +, -, *, etc.
- Leestekens zoals haakjes, hekje, komma
- 0, 1, ..., 9 cijfers
- Vetgedrukte tekenreeksen zoals id of if, alles dat een enkel terminalsymbool vertegenwoordigt
2. niet-terminals:
- Hoofdletters zoals A, B, C
- Cursieve namen in kleine letters: de uitdrukking of enkele
Contextvrije grammatica
Een CFG is een links-recursieve grammatica die ten minste één productie van het type heeft. De regels in een contextvrije grammatica zijn voornamelijk recursief. Een syntaxisanalysator controleert of het specifieke programma al dan niet voldoet aan alle regels van contextvrije grammatica. Als het wel voldoet, kunnen deze regelsyntaxisanalysatoren een ontleedboom voor dat programma maken.
expression -> expression -+ termexpression -> expression - termexpression-> termterm -> term * factorterm -> expression/ factorterm -> factor factorfactor -> ( expression )factor -> id
Grammatica Afleiding
Grammatica-afleiding is een opeenvolging van grammaticaregels die het startsymbool in de string transformeren. Een afleiding bewijst dat de string tot de taal van de grammatica behoort.
Meest linkse afleiding
Wanneer de sententiële vorm van invoer wordt gescand en van links naar rechts wordt vervangen, staat deze bekend als de meest linkse afleiding. De sententiële vorm die wordt afgeleid door de meest linkse afleiding wordt de linkse sententiële vorm genoemd.
Meest rechtse afleiding
Meest rechtse afleidingsscan en vervang de invoer door productieregels, van rechts naar links, volgorde. Het staat bekend als de meest rechtse afleiding. De sententiële vorm die is afgeleid van de meest rechtse afleiding staat bekend als de juiste-sententiële vorm.
Syntaxis versus Lexical Analyzer
Syntaxisanalyse |
Lexical Analyzer |
De syntaxisanalysator behandelt voornamelijk recursieve constructies van de taal. |
De lexicale analysator verlicht de taak van de syntaxisanalysator. |
De syntaxisanalysator werkt op tokens in een bronprogramma om betekenisvolle structuren in de programmeertaal te herkennen. |
De lexicale analysator herkent het token in een bronprogramma. |
Het ontvangt input, in de vorm van tokens, van lexicale analysatoren. |
Het is verantwoordelijk voor de geldigheid van een token geleverd door de syntaxisanalysator |
Nadelen van het gebruik van Syntax Analyzers
- Het zal nooit bepalen of een token geldig is of niet
- Het helpt u niet om te bepalen of een bewerking die op een token-type wordt uitgevoerd, geldig is of niet
- U kunt niet beslissen dat het token wordt gedeclareerd en geïnitialiseerd voordat het wordt gebruikt
Overzicht
- Syntaxisanalyse is een tweede fase van het compilerontwerpproces dat volgt op lexicale analyse
- De syntactische analysator helpt u regels op de code toe te passen
- Zin, Lexeme, Token, Trefwoorden en gereserveerde woorden, Ruiswoorden, Opmerkingen, Scheidingstekens, Tekenset, ID's zijn enkele belangrijke termen die worden gebruikt in de syntaxisanalyse in de compileerconstructie
- Parse controleert of de invoertekenreeks juist is gevormd, en zo niet, dan verwerpt u deze
- Parseringstechnieken zijn onderverdeeld in twee verschillende groepen: top-down parsing, bottom-up parsing
- Lexicaal, syntactisch, semantisch en logisch zijn enkele veelvoorkomende fouten die optreden tijdens de parseermethode
- Een grammatica is een reeks structurele regels die een taal beschrijven
- Symbolen voor notatieconventies kunnen worden aangegeven door het element tussen vierkante haken te plaatsen
- Een CFG is een links-recursieve grammatica die ten minste één productie van het type heeft
- Grammatica-afleiding is een opeenvolging van grammaticaregels die het startsymbool in de string transformeren
- De syntaxisanalysator behandelt voornamelijk recursieve constructies van de taal, terwijl de lexicale analysator de taak van de syntaxisanalysator in DBMS verlicht
- Het nadeel van de syntaxisanalysemethode is dat deze nooit zal bepalen of een token geldig is of niet