Analiza de sintaxă: Tipuri de analiză de sus în jos și de jos în sus a compilatorului

Ce este analiza sintaxei?

Analiza sintaxei este o a doua fază a procesului de proiectare a compilatorului în care șirul de intrare dat este verificat pentru confirmarea regulilor și a structurii gramaticii formale. Analizează structura sintactică și verifică dacă intrarea dată este în sintaxa corectă a limbajului de programare sau nu.

Analiza sintaxei în procesul de proiectare a compilatorului vine după faza de analiză lexicală. Este, de asemenea, cunoscut sub numele de Arborele de analiză sau Arborele de sintaxă. Arborele de analiză este dezvoltat cu ajutorul gramaticii predefinite a limbii. Analizatorul de sintaxă verifică, de asemenea, dacă un anumit program îndeplinește regulile implicate de o gramatică fără context. Dacă este satisfăcut, analizatorul creează apoi arborele de analiză al acelui program sursă. În caz contrar, va afișa mesaje de eroare.

Analiza sintaxei
Procesul analizorului de sintaxă

De ce aveți nevoie de Syntax Analyser?

  • Verificați dacă codul este valid din punct de vedere gramatical
  • Analizatorul sintactic vă ajută să aplicați regulile codului
  • Vă ajută să vă asigurați că fiecare bretele de deschidere are un echilibru de închidere corespunzător
  • Fiecare declarație are un tip și că tipul trebuie să fie există

Terminologie importantă pentru analizatorul de sintaxă

Terminologie importante utilizate în procesul de analiză a sintaxei:

  • Propoziție: O propoziție este un grup de caractere peste un anumit alfabet.
  • Lexem: Un lexem este unitatea sintactică de cel mai jos nivel a unei limbi (de exemplu, total, start).
  • Token: Un token este doar o categorie de lexeme.
  • Cuvinte cheie și cuvinte rezervate – Este un identificator care este utilizat ca parte fixă ​​a sintaxei unei instrucțiuni. Este un cuvânt rezervat pe care nu îl puteți folosi ca nume de variabilă sau identificator.
  • Cuvinte de zgomot – Cuvintele de zgomot sunt opționale care sunt inserate într-o declarație pentru a îmbunătăți lizibilitatea propoziției.
  • Comentarii – Este o parte foarte importantă a documentației. Se afișează în cea mai mare parte prin, /* */ sau//Alb (spații)
  • Delimitatori – Este un element sintactic care marchează începutul sau sfârșitul unei unități sintactice. Ca o declarație sau o expresie, „început”… „sfârșit” sau {}.
  • Set de caractere – ASCII, Unicode
  • Identificatorii – Este o restricție privind lungimea care vă ajută să reduceți lizibilitatea propoziției.
  • Operasimboluri tor – + și – efectuează două operații aritmetice de bază.
  • Elemente sintactice ale Limbii

De ce avem nevoie de Parsing?

Analizare

O analiză verifică, de asemenea, dacă șirul de intrare este bine format și, dacă nu, îl respinge.

Analizare

Următoarele sunt sarcinile importante efectuate de parser în proiectarea compilatorului:

  • Vă ajută să detectați toate tipurile de erori de sintaxă
  • Găsiți poziția în care a apărut eroarea
  • Descriere clară și precisă a erorii.
  • Recuperarea dintr-o eroare pentru a continua și a găsi erori suplimentare în cod.
  • Nu ar trebui să afecteze compilarea programelor „corecte”.
  • Analiza trebuie să respingă textele nevalide prin raportarea erorilor de sintaxă

Tehnici de analizare

Tehnicile de analiză sunt împărțite în două grupuri diferite:

  • Analiza de sus în jos,
  • Analiza de jos în sus

Analiza de sus în jos

În analiza de sus în jos, construcția arborelui de analiză începe de la rădăcină și apoi continuă spre frunze.

Două tipuri de analiză de sus în jos sunt:

  1. Analiza predictivă:

Analiza predictivă poate prezice ce producție ar trebui utilizată pentru a înlocui șirul de intrare specific. Analizorul predictiv folosește punctul de anticipare, care indică următoarele simboluri de intrare. Backtracking nu este o problemă cu această tehnică de analizare. Este cunoscut ca analizator LL(1).

  1. Analiza recursiva a coborârii:

Această tehnică de analizare analizează recursiv intrarea pentru a face un arbore de prase. Constă din mai multe funcții mici, câte una pentru fiecare nonterminal din gramatică.

Analiza de jos în sus

În analiza de jos în sus în proiectarea compilatorului, construcția arborelui de analiză începe cu părăsirea, apoi procesează către rădăcina sa. Se mai numește și analiză shift-reduce. Acest tip de analiză în proiectarea compilatorului este creat cu ajutorul unora software-unelte.

Eroare – Metode de recuperare

Erori frecvente care apar la analizarea în software-ul de sistem

  • Lexical: Numele unui identificator introdus incorect
  • Sintactic: paranteză dezechilibrată sau punct și virgulă lipsă
  • Semantice: atribuire de valoare incompatibilă
  • Logic: buclă infinită și cod inaccesibil

Un parser ar trebui să poată detecta și raporta orice eroare găsită în program. Deci, ori de câte ori a apărut o eroare, analizatorul. Ar trebui să fie capabil să se ocupe de el și să continue analizarea intrării rămase. Un program poate avea următoarele tipuri de erori în diferite etape ale procesului de compilare. Există cinci metode comune de recuperare a erorilor care pot fi implementate în parser

Recuperare în modul declarație

  • În cazul în care analizatorul întâmpină o eroare, vă ajută să luați măsuri corective. Acest lucru permite ca restul intrărilor și stărilor să fie analizate înainte.
  • De exemplu, adăugarea unui punct și virgulă lipsă vine în metoda de recuperare în modul declarație. Cu toate acestea, designerul de analiză trebuie să fie atent în timp ce face aceste modificări, deoarece o corecție greșită poate duce la o buclă infinită.

Recuperare în modul de panică

  • În cazul în care analizatorul întâmpină o eroare, acest mod ignoră restul instrucțiunii și nu procesează intrarea de la intrarea eronată la delimitator, ca un punct și virgulă. Aceasta este o metodă simplă de recuperare a erorilor.
  • În acest tip de metodă de recuperare, analizatorul respinge simbolurile de intrare unul câte unul până când este găsit un singur grup desemnat de jetoane de sincronizare. Jetoanele de sincronizare folosesc în general delimitatori precum sau.

Recuperare la nivel de frază

  • Compilatorul corectează programul inserând sau ștergând jetoane. Acest lucru îi permite să procedeze la analiza de unde a fost. Efectuează corecția la intrarea rămasă. Poate înlocui un prefix al intrării rămase cu un șir de caractere, ceea ce ajută analizatorul să continue procesul.

Error Productions

  • Recuperarea producției de erori extinde gramatica limbajului care generează constructele eronate. Analizorul efectuează apoi un diagnostic de eroare despre acel construct.

Corecție globală

  • Compilatorul ar trebui să facă un număr cât mai mic de modificări posibil în timp ce procesează un șir de intrare incorect. Având în vedere șirul de intrare incorect a și gramatica c, algoritmii vor căuta un arbore de analiză pentru un șir înrudit b. La fel ca unele inserții, ștergeri și modificări făcute de jetoane necesare pentru a transforma an în b este cât mai puțin posibil.

Gramatică

O gramatică este un set de reguli structurale care descriu o limbă. Gramaticile atribuie o structură oricărei propoziții. Acest termen se referă și la studiul acestor reguli, iar acest fișier include morfologia, fonologia și sintaxa. Este capabil să descrie multe, din sintaxa lui limbaje de programare.

Reguli de gramatică a formei

  • Simbolul non-terminal ar trebui să apară în partea stângă a cel puțin unei producții
  • Simbolul obiectivului nu ar trebui să fie afișat niciodată în dreapta::= al oricărei producții
  • O regulă este recursivă dacă LHS apare în RHS

Convenții notaționale

Simbolul convențiilor de notație poate fi indicat prin includerea elementului între paranteze drepte. Este o succesiune arbitrară de instanțe ale elementului care poate fi indicată prin includerea elementului între acolade urmată de un simbol asterisc, { … }*.

Este o alegere a alternativei care poate folosi simbolul în cadrul regulii unice. Poate fi cuprins între paranteze ([,] ) când este necesar.

Două tipuri de convenții notaționale zona Terminal și Non-terminale

1.Terminale:

  • Litere mici din alfabet, cum ar fi a, b, c,
  • Operasimboluri precum +,-, * etc.
  • Simboluri de punctuație, cum ar fi paranteze, hash, virgulă
  • 0, 1, …, 9 cifre
  • Șiruri de caractere aldine precum id sau if, orice reprezintă un singur simbol terminal

2.Nonterminale:

  • Litere mari, cum ar fi A, B, C
  • Nume cursive cu litere mici: expresia sau unele

Gramatică liberă de context

Un CFG este o gramatică recursiv la stânga care are cel puțin o producție de acest tip. Regulile dintr-o gramatică fără context sunt în principal recursive. Un analizor de sintaxă verifică dacă programul specific îndeplinește sau nu toate regulile gramaticii fără context. Dacă îndeplinește aceste reguli, analizatorii de sintaxă pot crea un arbore de analiză pentru programul respectiv.

expression -> expression -+ term
expression -> expression – term 
expression-> term
term  -> term * factor
term -> expression/ factor
term  -> factor factor
factor ->  ( expression )
factor -> id

Derivarea gramaticală

Derivarea gramaticală este o secvență de reguli gramaticale care transformă simbolul de început în șir. O derivare demonstrează că șirul aparține limbajului gramatical.

Derivarea cea mai din stânga

Când forma propozițională de intrare este scanată și înlocuită în secvență de la stânga la dreapta, este cunoscută sub numele de derivație din stânga. Forma propozițională care este derivată prin derivația cea mai din stânga se numește forma propozițională din stânga.

Derivarea cea mai dreaptă

Derivarea din dreapta scanează și înlocuiește intrarea cu reguli de producție, de la dreapta la stânga, secvență. Este cunoscută drept derivație cea mai dreaptă. Forma propozițională care este derivată din derivația cea mai din dreapta este cunoscută ca formă de propoziție dreapta.

Sintaxă vs. Analizor lexical

Analizor de sintaxă Analizor lexical
Analizatorul de sintaxă se ocupă în principal de constructe recursive ale limbajului. Analizatorul lexical ușurează sarcina analizorului de sintaxă.
Analizatorul de sintaxă lucrează pe token-uri dintr-un program sursă pentru a recunoaște structurile semnificative în limbajul de programare. Analizorul lexical recunoaște simbolul într-un program sursă.
Primește intrări, sub formă de jetoane, de la analizatorii lexicali. Este responsabil pentru valabilitatea unui simbol furnizat de

analizatorul de sintaxă

Dezavantajele utilizării analizoarelor de sintaxă

  • Nu va determina niciodată dacă un simbol este valid sau nu
  • Not vă ajută să determinați dacă o operațiune efectuată pe un tip de simbol este validă sau nu
  • Nu puteți decide că tokenul este declarat și inițializat înainte de a fi utilizat

Rezumat

  • Analiza de sintaxă este o a doua fază a procesului de proiectare a compilatorului care vine după analiza lexicală
  • Analizatorul sintactic vă ajută să aplicați regulile codului
  • Propoziție, Lexemă, Token, Cuvinte cheie și cuvinte rezervate, Cuvinte de zgomot, Comentarii, Delimitatori, Set de caractere, Identificatori sunt câțiva termeni importanți utilizați în analiza sintaxei în construcția compilatorului
  • Parse verifică dacă șirul de intrare este bine format și, dacă nu, îl respinge
  • Tehnicile de analiză sunt împărțite în două grupe diferite: analiza de sus în jos, analizarea de jos în sus
  • Lexicale, sintactice, semantice și logice sunt unele erori frecvente care apar în timpul metodei de parsare
  • O gramatică este un set de reguli structurale care descriu o limbă
  • Simbolul convențiilor de notație poate fi indicat prin includerea elementului între paranteze drepte
  • Un CFG este o gramatică recursiv la stânga care are cel puțin o producție de acest tip
  • Derivarea gramaticală este o secvență de reguli gramaticale care transformă simbolul de început în șir
  • Analizatorul de sintaxă se ocupă în principal de constructe recursive ale limbii, în timp ce analizatorul lexical ușurează sarcina analizorului de sintaxă în Baze de date
  • Dezavantajul metodei analizorului de sintaxă este că nu va determina niciodată dacă un simbol este valid sau nu