Syntaksanalyse: Compiler Top Down & Analysetyper fra bunden op

Indholdsfortegnelse:

Anonim

Hvad er syntaksanalyse?

Syntaksanalyse er en anden fase af compiler-designprocessen, 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 Compiler Design-processen kommer efter den leksikale analysefase. Det er også kendt som Parse Tree eller Syntax Tree. Parse Tree er udviklet ved hjælp af foruddefineret sproglig grammatik. Syntaksanalysatoren kontrollerer også, om et givet program opfylder reglerne i en kontekstfri grammatik. Hvis det opfylder, opretter parseren derefter parsetræet for det kildeprogram. Ellers viser den fejlmeddelelser.

Syntaksanalysatorproces

I denne vejledning lærer du

  • Hvorfor har du brug for Syntax Analyzer?
  • Vigtig syntaksanalysatorterminologi
  • Hvorfor har vi brug for parsing?
  • Analyseringsteknikker
  • Fejl - Gendannelsesmetoder
  • Grammatik:
  • Notationelle konventioner
  • Kontekstfri grammatik
  • Grammatikafledning
  • Syntaks vs. Lexical Analyzer
  • Ulemper ved at bruge syntaksanalysatorer

Hvorfor har du brug for Syntax Analyzer?

  • Kontroller, om koden er gyldig grammatisk
  • Den syntaktiske analysator hjælper dig med at anvende regler på koden
  • Hjælper dig med at sikre dig, at hver åbningsbøjle har en tilsvarende lukkebalance
  • Hver erklæring har en type, og at typen skal eksistere

Vigtig syntaksanalysatorterminologi

Vigtige terminologier, der anvendes i syntaksanalyseprocessen:

  • Sætning: En sætning er en gruppe af tegn over et eller andet alfabet.
  • Lexeme: Et lexeme er det laveste niveau syntaktiske enhed på et sprog (f.eks. Total, start).
  • Token: Et token er kun en kategori af leksemer.
  • Nøgleord og reserverede ord - Det er en identifikator, der bruges som en fast del af en syntaks for en sætning. Det er et reserveret ord, som du ikke kan bruge som variabelnavn eller identifikator.
  • Støjord - Støjord er valgfri, 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 af, / * * / eller // Blank (mellemrum)
  • Afgrænsere - Det er et syntaktisk element, der markerer starten eller slutningen af ​​en eller anden syntaktisk enhed. Ligesom en erklæring eller et udtryk, "start" ... "slut" eller {}.
  • Tegnsæt - ASCII, Unicode
  • Identifikatorer - Det er en begrænsning af længden, som hjælper dig med at reducere sætningens læsbarhed.
  • Operatørsymboler - + og - udfører to grundlæggende aritmetiske operationer.
  • Syntaktiske elementer i sproget

Hvorfor har vi brug for parsing?

En analyse kontrollerer også, at inputstrengen er velformet, og hvis ikke, afvis den.

Følgende er vigtige opgaver, der udføres af parseren i compiler design:

  • Hjælper dig med at opdage alle typer syntaksfejl
  • Find den position, hvor fejlen er opstået
  • Klar og nøjagtig beskrivelse af fejlen.
  • Gendannelse efter en fejl for at fortsætte og finde yderligere fejl i koden.
  • Bør ikke påvirke kompilering af "korrekte" programmer.
  • Analysen skal afvise ugyldige tekster ved at rapportere syntaksfejl

Analyseringsteknikker

Analyseringsteknikker er opdelt i to forskellige grupper:

  • Analyse ovenfra og ned,
  • Analyse nedenfra og op

Top-Down-parsing:

I top-down-parsering begynder konstruktionen af ​​parse-træet ved roden og fortsætter derefter mod bladene.

To typer top-down-parsing er:

  1. Forudsigende parsing:

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

  1. Rekursiv nedstigningsparsering:

Denne parsingsteknik analyserer input rekursivt for at lave et prase-træ. Den består af flere små funktioner, en til hver ikke-terminal i grammatikken.

Analyse nedenfra og op:

I bund-op-parsing i compiler-design begynder konstruktionen af ​​parse-træet med orloven, og derefter bearbejdes den mod sin rod. Det kaldes også som skiftreducerende parsing. Denne type parsing i compiler design oprettes ved hjælp af nogle softwareværktøjer.

Fejl - Gendannelsesmetoder

Almindelige fejl, der opstår i parsing i systemsoftware

  • Lexikal : Navnet på en forkert indtastet identifikator
  • Syntaktisk : ubalanceret parentes eller manglende semikolon
  • Semantisk : uforenelig værditildeling
  • Logisk : Uendelig løkke og ikke tilgængelig kode

En parser skal kunne registrere og rapportere enhver fejl, der findes i programmet. Så når en fejl opstod parseren. Det skal være i stand til at håndtere det og fortsætte med at analysere det resterende input. Et program kan have følgende typer fejl i forskellige kompileringsfaser. Der er fem almindelige fejlgendannelsesmetoder, som kan implementeres i parseren

Statement mode recovery

  • I tilfælde af at parseren støder på en fejl, hjælper det dig med at tage korrigerende trin. Dette gør det muligt for resten af ​​input og stater at parse fremad.
  • For eksempel tilføjes et manglende semikolon kommer i sætningstilstandsgendannelsesmetode. Parse-designer skal dog være forsigtig med at foretage disse ændringer, da en forkert korrektion kan føre til en uendelig løkke.

Panic-Mode opsving

  • I tilfælde, hvor parseren støder på en fejl, ignorerer denne tilstand resten af ​​udsagnet og behandler ikke input fra fejlagtig input til afgrænsning, som en semikolon. Dette er en simpel metode til gendannelse af fejl.
  • I denne type gendannelsesmetode afviser parseren input-symboler en efter en, indtil der findes en enkelt angivet gruppe af synkroniseringstokener. De synkroniserende tokens bruger normalt afgrænsere som eller.

Gendannelse af sætningsniveau:

  • Compiler korrigerer programmet ved at indsætte eller slette tokens. Dette giver det mulighed for at fortsætte med at analysere, hvor det var. Den udfører korrektion af den resterende input. Det kan erstatte et præfiks for den resterende input med en streng, dette hjælper parseren med at fortsætte processen.

Fejlproduktioner

  • Fejlproduktionsgendannelse udvider grammatikken for det sprog, der genererer de fejlagtige konstruktioner. Parseren udfører derefter fejldiagnosticering af denne konstruktion.

Global korrektion:

  • Compileren skal foretage færre antal ændringer som muligt under behandling af en forkert inputstreng. Givet forkert inputstreng a og grammatik c, vil algoritmer søge efter et parse-træ efter en relateret streng b. Som nogle indsættelser er sletninger og ændringer lavet af tokens, der er nødvendige for at omdanne en til b, så lidt som muligt.

Grammatik:

En grammatik er et sæt strukturelle regler, der beskriver et sprog. Grammatikker tildeler struktur til enhver sætning. Dette udtryk henviser også til studiet af disse regler, og denne fil inkluderer morfologi, fonologi og syntaks. Den er i stand til at beskrive mange af syntaksen for programmeringssprog.

Regler for formgrammatik

  • Det ikke-terminale symbol skal vises til venstre for mindst en produktion
  • Målsymbolet skal aldrig vises til højre for :: = for nogen produktion
  • En regel er rekursiv, hvis LHS vises i sin RHS

Notationelle konventioner

Symbol for konventionelle konventioner kan angives ved at omslutte elementet i firkantede parenteser. Det er en vilkårlig rækkefølge af forekomster af elementet, som kan angives ved at omslutte elementet i parentes efterfulgt af et stjernesymbol, {...} *.

Det er et valg af alternativet, der kan bruge symbolet inden for den enkelte regel. Det kan være omsluttet af parentes ([,]) når det er nødvendigt.

To typer notationelle konventioner område Terminal og ikke-terminaler

1. terminaler:

  • Små bogstaver i alfabetet såsom a, b, c,
  • Operatørsymboler som +, -, * osv.
  • Tegnsætningssymboler som parenteser, hash, komma
  • 0, 1,…, 9 cifre
  • Fed skrift strenge som id eller hvis, noget, der repræsenterer et enkelt terminalsymbol

2. non-terminaler:

  • Store bogstaver som A, B, C
  • Små kursive navne: udtrykket eller nogle

Kontekstfri grammatik

En CFG er en venstre-rekursiv grammatik, der har mindst en produktion af typen. Reglerne i en kontekstfri grammatik er hovedsageligt rekursive. En syntaksanalysator kontrollerer, at specifikt program opfylder alle reglerne for kontekstfri grammatik eller ej. Hvis det opfylder, kan disse regler syntaksanalysatorer oprette et analysetræ for det pågældende program.

expression -> expression -+ termexpression -> expression - termexpression-> termterm -> term * factorterm -> expression/ factorterm -> factor factorfactor -> ( expression )factor -> id

Grammatikafledning

Grammatikafledning er en sekvens af grammatikregel, der omdanner startsymbolet til strengen. En afledning beviser, at strengen hører til grammatikens sprog.

Venstre mest afledning

Når den sentimentale form for input scannes og erstattes i venstre til højre rækkefølge, er det kendt som den mest venstre afledning. Den sententielle form, der er afledt af den afledning, der er længst til venstre, kaldes den venstre-sententielle form.

Højeste afledning

Afledning af yderste højre side og erstat input med produktionsregler, fra højre til venstre, sekvens. Det er kendt som den højeste afledning. Sententiel form, der er afledt af den yderste afledning, er kendt som ret sentimental form.

Syntaks vs. Lexical Analyzer

Syntaksanalysator

Lexical Analyzer

Syntaksanalysatoren beskæftiger sig primært med rekursive konstruktioner af sproget.

Den leksikale analysator letter syntaksanalysatorens opgave.

Syntaksanalysatoren arbejder på tokens i et kildeprogram for at genkende meningsfulde strukturer i programmeringssproget.

Den leksikale analysator genkender tokenet i et kildeprogram.

Det modtager input i form af tokens fra leksikale analysatorer.

Det er ansvarligt for gyldigheden af ​​et token leveret af

syntaksanalysatoren

Ulemper ved at bruge syntaksanalysatorer

  • Det vil aldrig afgøre, om et token er gyldigt eller ej
  • Ikke hjælper dig med at afgøre, om en operation udført på en token-type er gyldig eller ej
  • Du kan ikke beslutte, at token erklæres og initialiseres, før det bruges

Resumé

  • Syntaksanalyse er en anden fase af compiler-designprocessen, der kommer efter leksikalanalyse
  • 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ænsere, Tegnsæt, Identifikatorer er nogle vigtige udtryk, der bruges i syntaksanalyse i kompilatorkonstruktion
  • Parse kontrollerer, at inputstrengen er velformet, og hvis ikke, afvis den
  • Parsingsteknikker er opdelt i to forskellige grupper: Top-Down Parsing, Bottom-Up Parsing
  • Lexikal, syntaktisk, semantisk og logisk, nogle almindelige fejl opstår under parsingsmetoden
  • En grammatik er et sæt strukturelle regler, der beskriver et sprog
  • Symbol for konventionelle konventioner kan angives ved at omslutte elementet i firkantede parenteser
  • En CFG er en venstre-rekursiv grammatik, der har mindst en produktion af typen
  • Grammatikafledning er en sekvens af grammatikregel, der omdanner startsymbolet til strengen
  • Syntaksanalysatoren beskæftiger sig hovedsageligt med rekursive konstruktioner af sproget, mens den leksikale analysator letter syntaksanalysatorens opgave i DBMS
  • Ulempen ved Syntax analysator metode er, at den aldrig vil afgøre, om et token er gyldigt eller ej