Syntaksanalyse: Compiler Top Down & Bottom Up Parsingstyper

Hvad er syntaksanalyse?

Syntaksanalyse er en anden fase af compilerdesignprocessen, hvor den givne inputstreng kontrolleres for bekrรฆftelse af regler og struktur for den formelle grammatik. Den analyserer den syntaktiske struktur og kontrollerer, om det givne input er i den korrekte syntaks for programmeringssproget eller ej.

Syntaksanalyse i compilerdesignproces kommer efter den leksikalske analysefase. Det er ogsรฅ kendt som Parse Tree eller Syntax Tree. Parse Tree er udviklet ved hjรฆlp af foruddefineret grammatik af sproget. Syntaksanalysatoren kontrollerer ogsรฅ, om et givet program opfylder reglerne i en kontekstfri grammatik. Hvis den opfylder, opretter parseren derefter parsetrรฆet for det pรฅgรฆldende kildeprogram. Ellers vil den vise fejlmeddelelser.

Syntaksanalyse
Syntaksanalyseproces

Hvorfor har du brug for Syntax Analyser?

  • Tjek om koden er grammatisk gyldig
  • Den syntaktiske analysator hjรฆlper dig med at anvende regler pรฅ koden
  • Hjรฆlper dig med at sikre, at hver รฅbningsbรธjle har en tilsvarende lukkebalance
  • Hver erklรฆring har en type, og at typen skal eksistere

Vigtig syntaksanalysatorterminologi

Vigtige terminologier brugt i syntaksanalyseprocessen:

  • Dรธmme: En sรฆtning er en gruppe af tegn over et eller andet alfabet.
  • Leksem: Et leksem er den laveste syntaktiske enhed i et sprog (f.eks. total, start).
  • Token: Et token er blot en kategori af leksemer.
  • Nรธgleord og reserverede ord โ€“ Det er en identifikator, der bruges som en fast del af syntaksen i et udsagn. Det er et reserveret ord, som du ikke kan bruge som variabelnavn eller identifikator.
  • Stรธjord โ€“ Stรธjord er valgfrie, som indsรฆttes i en erklรฆring for at forbedre sรฆtningens lรฆsbarhed.
  • Kommentarer โ€“ Det er en meget vigtig del af dokumentationen. Det vises for det meste med /* */, eller//Blank (mellemrum)
  • afgrรฆnsere โ€“ Det er et syntaktisk element, som markerer starten eller slutningen af โ€‹โ€‹en eller anden syntaktisk enhed. Som et udsagn eller udtryk, "begynd"..."slut" eller {}.
  • Tegn sรฆt โ€“ ASCII, Unicode
  • Identifikatorer โ€“ Det er en begrรฆnsning af lรฆngden, som hjรฆlper dig med at reducere sรฆtningens lรฆsbarhed.
  • Operator symboler โ€“ + og โ€“ udfรธrer to grundlรฆggende aritmetiske operationer.
  • Syntaktiske elementer i sproget

Hvorfor har vi brug for parsing?

parsing

En parse kontrollerer ogsรฅ, at inputstrengen er velformet, og hvis ikke, afvis den.

parsing

Fรธlgende er vigtige opgaver, som parseren udfรธrer i compilerdesign:

  • Hjรฆlper dig med at opdage alle typer syntaksfejl
  • Find den position, hvor fejlen er opstรฅet
  • Klar og prรฆcis beskrivelse af fejlen.
  • Retablering fra en fejl for at fortsรฆtte og finde yderligere fejl i koden.
  • Bรธr ikke pรฅvirke kompilering af "korrekte" programmer.
  • Parsen skal afvise ugyldige tekster ved at rapportere syntaksfejl

Parsing teknikker

Parsingteknikker er opdelt i to forskellige grupper:

  • Top-down parsing,
  • Bottom-up parsing

Top-down parsing

I den top-down parsing starter konstruktionen af โ€‹โ€‹parsetrรฆet ved roden og fortsรฆtter derefter mod bladene.

To typer top-down-parsing er:

  1. Forudsigende parsing:

Prediktiv parse kan forudsige, hvilken produktion der skal bruges til at erstatte den specifikke inputstreng. Den forudsigende parser bruger look-ahead point, som peger mod nรฆste input symboler. Backtracking er ikke et problem med denne parsingteknik. Det er kendt som LL(1) Parser

  1. Rekursiv descent parsing:

Denne parsing-teknik analyserer rekursivt inputtet for at lave et prasetrรฆ. Den bestรฅr af flere smรฅ funktioner, en for hver ikke-terminal i grammatikken.

Bottom-up parsing

I parsing fra bunden og op i compilerdesign starter konstruktionen af โ€‹โ€‹parsetrรฆet med bladet, og derefter bearbejder det mod sin rod. Det kaldes ogsรฅ shift-reduce parsing. Denne type parsing i compilerdesign er skabt ved hjรฆlp af nogle softwarevรฆrktรธjer.

Fejl โ€“ Gendannelsesmetoder

Almindelige fejl, der opstรฅr i parsing i systemsoftware

  • leksikalsk: Navn pรฅ en forkert indtastet identifikator
  • Syntaktisk: ubalanceret parentes eller et manglende semikolon
  • Semantisk: uforenelig vรฆrditildeling
  • Logisk: Uendelig slรธjfe og ikke tilgรฆngelig kode

En parser skal vรฆre i stand til at opdage og rapportere enhver fejl fundet i programmet. Sรฅ hver gang der opstod en fejl, parseren. Det burde kunne hรฅndtere det og fortsรฆtte med at analysere det resterende input. Et program kan have fรธlgende typer fejl i forskellige kompileringsprocesser. Der er fem almindelige fejlgendannelsesmetoder, som kan implementeres i parseren

Gendannelse af erklรฆringstilstand

  • I det tilfรฆlde, hvor parseren stรธder pรฅ en fejl, hjรฆlper det dig med at tage korrigerende skridt. Dette tillader resten af โ€‹โ€‹input og tilstande at parse fremad.
  • For eksempel, tilfรธjelse af et manglende semikolon kommer i sรฆtningstilstands gendannelsesmetode. Parse-designeren skal dog vรฆre forsigtig, mens du foretager disse รฆndringer, da en forkert korrektion kan fรธre til en uendelig lรธkke.

Panic-Mode gendannelse

  • I det tilfรฆlde, hvor parseren stรธder pรฅ en fejl, ignorerer denne tilstand resten af โ€‹โ€‹sรฆtningen og behandler ikke input fra forkert input til afgrรฆnsningstegn, som et semikolon. Dette er en simpel fejlgendannelsesmetode.
  • I denne type gendannelsesmetode afviser parseren inputsymboler รฉn efter รฉn, indtil en enkelt udpeget gruppe af synkroniseringstokens er fundet. Synkroniseringstokens bruger generelt afgrรฆnsere som eller.

Gendannelse pรฅ sรฆtningsniveau

  • Compiler retter programmet ved at indsรฆtte eller slette tokens. Dette giver den mulighed for at fortsรฆtte med at parse, hvorfra den var. Den udfรธrer korrektion pรฅ det resterende input. Det kan erstatte et prรฆfiks for det resterende input med en streng, hvilket hjรฆlper parseren med at fortsรฆtte processen.

Fejlproduktioner

  • Gendannelse af fejlproduktion udvider grammatikken for det sprog, som genererer de fejlagtige konstruktioner. Parseren udfรธrer derefter fejldiagnostik om denne konstruktion.

Global korrektion

  • Compileren skal foretage fรฆrre รฆndringer som muligt under behandling af en forkert inputstreng. Givet forkert inputstreng a og grammatik c, vil algoritmer sรธge efter et parsetrรฆ for en relateret streng b. Ligesom nogle indsรฆttelser, sletninger og modifikationer lavet af tokens, der er nรธdvendige for at transformere an til b, er sรฅ lidt som muligt.

Grammatik

En grammatik er et sรฆt af strukturelle regler, der beskriver et sprog. Grammatikker tildeler struktur til enhver sรฆtning. Dette udtryk refererer ogsรฅ til studiet af disse regler, og denne fil inkluderer morfologi, fonologi og syntaks. Det er i stand til at beskrive mange, af syntaksen af programmeringssprog.

Regler for formgrammatik

  • Det ikke-terminale symbol skal vises til venstre for den mindst ene produktion
  • Mรฅlsymbolet bรธr aldrig vises til hรธjre for::= af nogen produktion
  • En regel er rekursiv, hvis LHS vises i dens RHS

Notationskonventioner

Symbol for notationskonventioner kan angives ved at omslutte elementet i firkantede parenteser. Det er en vilkรฅrlig sekvens af forekomster af elementet, som kan angives ved at omslutte elementet i klammer efterfulgt af et stjernesymbol, { โ€ฆ }*.

Det er et valg af alternativet, som kan bruge symbolet inden for den enkelte regel. Det kan vรฆre omgivet af parentes ([,] ), nรฅr det er nรธdvendigt.

To typer notationskonventioner omrรฅde Terminal og Ikke-terminaler

1. Terminaler:

  • Smรฅ bogstaver i alfabetet, sรฅsom a, b, c,
  • Operator-symboler som +,-, * osv.
  • Tegnsรฆtningssymboler sรฅsom parenteser, hash, komma
  • 0, 1, โ€ฆ, 9 cifre
  • Fed skriftstrenge som id eller if, alt hvad der reprรฆsenterer et enkelt terminalsymbol

2. Ikke-terminaler:

  • Store bogstaver som A, B, C
  • Navne med smรฅ bogstaver i kursiv: udtrykket eller nogle

Kontekst gratis grammatik

En CFG er en venstre-rekursiv grammatik, der har mindst รฉn produktion af typen. Reglerne i en kontekstfri grammatik er hovedsageligt rekursive. En syntaksanalysator kontrollerer, at det specifikke program opfylder alle reglerne for kontekstfri grammatik eller ej. Hvis den opfylder, kan disse reglersyntaksanalysatorer oprette et parsetrรฆ for det pรฅgรฆldende program.

expression -> expression -+ term
expression -> expression โ€“ term 
expression-> term
term  -> term * factor
term -> expression/ factor
term  -> factor factor
factor ->  ( expression )
factor -> id

Grammatisk afledning

Grammatikafledning er en sekvens af grammatikregler, som omdanner startsymbolet til strengen. En afledning beviser, at strengen hรธrer til grammatikkens sprog.

Afledning lรฆngst til venstre

Nรฅr sรฆtningsformen for input scannes og erstattes i venstre mod hรธjre rรฆkkefรธlge, er det kendt som afledning lรฆngst til venstre. Sรฆtningsformen, som er afledt af afledningen lรฆngst til venstre, kaldes den venstre sรฆtningsform.

Afledning lรฆngst til hรธjre

Afledning lรฆngst til hรธjre scan og erstat input med produktionsregler, fra hรธjre mod venstre, sekvens. Det er kendt som afledning lรฆngst til hรธjre. Den sรฆtningsform, der er afledt af den lรฆngst hรธjre afledning, er kendt som hรธjre sรฆtningsform.

Syntaks vs. leksikalsk analysator

Syntaksanalysator Leksisk analysator
Syntaksanalysatoren beskรฆftiger sig hovedsageligt med rekursive konstruktioner af sproget. Den leksikalske analysator letter opgaven med syntaksanalysatoren.
Syntaksanalysatoren arbejder pรฅ tokens i et kildeprogram for at genkende meningsfulde strukturer i programmeringssproget. Den leksikale analysator genkender tokenet i et kildeprogram.
Den modtager input i form af tokens fra leksikale analysatorer. Den er ansvarlig for gyldigheden af โ€‹โ€‹et token leveret af

syntaksanalysatoren

Ulemper ved at bruge Syntax Analyzers

  • Det vil aldrig afgรธre, om et token er gyldigt eller ej
  • Not hjรฆlper dig med at afgรธre, om en operation udfรธrt pรฅ en tokentype er gyldig eller ej
  • Du kan ikke beslutte, at token skal erklรฆres og initialiseres, fรธr det bliver brugt

Resumรฉ

  • Syntaksanalyse er en anden fase af compilerdesignprocessen, der kommer efter leksikalsk analyse
  • Den syntaktiske analysator hjรฆlper dig med at anvende regler pรฅ koden
  • Sรฆtning, Lexeme, Token, Nรธgleord og reserverede ord, Stรธjord, Kommentarer, Afgrรฆnsningstegn, Tegnsรฆt, Identifikatorer er nogle vigtige udtryk, der bruges i syntaksanalysen i compilerkonstruktion
  • Parse kontrollerer, at inputstrengen er velformet, og hvis ikke, afviser den
  • Parsingteknikker er opdelt i to forskellige grupper: Top-Down Parsing, Bottom-Up Parsing
  • Leksikalsk, syntaktisk, semantisk og logisk er nogle almindelige fejl, der opstรฅr under parsingmetoden
  • En grammatik er et sรฆt af strukturelle regler, der beskriver et sprog
  • Symbol for notationskonventioner kan angives ved at omslutte elementet i firkantede parenteser
  • En CFG er en venstre-rekursiv grammatik, der har mindst รฉn produktion af typen
  • Grammatikafledning er en sekvens af grammatikregler, som omdanner startsymbolet til strengen
  • Syntaksanalysatoren beskรฆftiger sig hovedsageligt med rekursive konstruktioner af sproget, mens den leksikalske analysator letter syntaksanalysatorens opgave i DBMS
  • Ulempen ved Syntax-analysatormetoden er, at den aldrig vil afgรธre, om et token er gyldigt eller ej

Opsummer dette indlรฆg med: