Cos'è l'analisi della sintassi?
L'analisi della sintassi è una seconda fase del processo di progettazione del compilatore in cui viene controllata la stringa di input data per la conferma delle regole e della struttura della grammatica formale. Analizza la struttura sintattica e controlla se l'input fornito è nella sintassi corretta del linguaggio di programmazione o meno.
L'analisi della sintassi nel processo di progettazione del compilatore viene eseguita dopo la fase di analisi lessicale. È anche noto come Parse Tree o Syntax Tree. Il Parse Tree è sviluppato con l'aiuto della grammatica predefinita della lingua. L'analizzatore di sintassi controlla anche se un determinato programma soddisfa le regole implicite da una grammatica libera dal contesto. Se soddisfa, il parser crea quindi l'albero di analisi di quel programma sorgente. In caso contrario, verranno visualizzati messaggi di errore.

In questo tutorial imparerai
- Perché hai bisogno di Syntax Analyzer?
- Importante terminologia dell'analizzatore di sintassi
- Perché abbiamo bisogno dell'analisi?
- Tecniche di analisi
- Errore - Metodi di ripristino
- Grammatica:
- Convenzioni notazionali
- Grammatica libera dal contesto
- Derivazione grammaticale
- Sintassi vs. analizzatore lessicale
- Svantaggi dell'utilizzo degli analizzatori di sintassi
Perché hai bisogno di Syntax Analyzer?
- Controlla se il codice è grammaticalmente valido
- L'analizzatore sintattico ti aiuta ad applicare le regole al codice
- Ti aiuta ad assicurarti che ogni parentesi graffa di apertura abbia un saldo di chiusura corrispondente
- Ogni dichiarazione ha un tipo e che il tipo deve essere esistente
Importante terminologia dell'analizzatore di sintassi
Terminologie importanti utilizzate nel processo di analisi della sintassi:
- Frase: una frase è un gruppo di caratteri sopra un alfabeto.
- Lessema: un lessema è l'unità sintattica di livello più basso di una lingua (ad esempio, totale, inizio).
- Token: un token è solo una categoria di lessemi.
- Parole chiave e parole riservate : è un identificatore utilizzato come parte fissa della sintassi di un'istruzione. È una parola riservata che non puoi usare come nome o identificatore di variabile.
- Parole non significative - Le parole non significative sono opzionali e vengono inserite in un'istruzione per migliorare la leggibilità della frase.
- Commenti : è una parte molto importante della documentazione. Viene visualizzato principalmente da, / * * / o // Vuoto (spazi)
- Delimitatori - È un elemento sintattico che segna l'inizio o la fine di alcune unità sintattiche. Come una dichiarazione o un'espressione, "inizio" ... "fine" o {}.
- Set di caratteri : ASCII, Unicode
- Identificatori - È una restrizione sulla lunghezza che ti aiuta a ridurre la leggibilità della frase.
- I simboli degli operatori - + e - eseguono due operazioni aritmetiche di base.
- Elementi sintattici del linguaggio
Perché abbiamo bisogno dell'analisi?
Un'analisi controlla anche che la stringa di input sia ben formata e, in caso contrario, la rifiuta.
Di seguito sono riportate importanti attività eseguite dal parser nella progettazione del compilatore:
- Ti aiuta a rilevare tutti i tipi di errori di sintassi
- Trova la posizione in cui si è verificato l'errore
- Descrizione chiara e precisa dell'errore.
- Ripristino da un errore per continuare e trovare ulteriori errori nel codice.
- Non dovrebbe influire sulla compilazione di programmi "corretti".
- L'analisi deve rifiutare i testi non validi segnalando errori di sintassi
Tecniche di analisi
Le tecniche di analisi sono divise in due diversi gruppi:
- Analisi dall'alto verso il basso,
- Analisi dal basso verso l'alto
Analisi dall'alto verso il basso:
Nell'analisi top-down la costruzione dell'albero sintetico inizia dalla radice e poi procede verso le foglie.
Due tipi di analisi dall'alto verso il basso sono:
- Analisi predittiva:
L'analisi predittiva può prevedere quale produzione deve essere utilizzata per sostituire la stringa di input specifica. Il parser predittivo utilizza il punto di previsione, che punta verso i simboli di input successivi. Il backtracking non è un problema con questa tecnica di analisi. È noto come LL (1) Parser
- Analisi della discesa ricorsiva:
Questa tecnica di analisi analizza ricorsivamente l'input per creare un albero prase. Consiste di diverse piccole funzioni, una per ogni non terminale nella grammatica.
Analisi bottom-up:
Nell'analisi dal basso verso l'alto nella progettazione del compilatore, la costruzione dell'albero di analisi inizia con il congedo e quindi procede verso la sua radice. Viene anche chiamato analisi di riduzione dello spostamento. Questo tipo di analisi nella progettazione del compilatore viene creato con l'aiuto dell'utilizzo di alcuni strumenti software.
Errore - Metodi di ripristino
Errori comuni che si verificano durante l'analisi nel software di sistema
- Lessico : nome di un identificatore digitato in modo errato
- Sintattico : parentesi sbilanciata o punto e virgola mancante
- Semantica : assegnazione di valore incompatibile
- Logico : loop infinito e codice non raggiungibile
Un parser dovrebbe essere in grado di rilevare e segnalare qualsiasi errore rilevato nel programma. Quindi, ogni volta che si verifica un errore, il parser. Dovrebbe essere in grado di gestirlo e continuare ad analizzare l'input rimanente. Un programma può presentare i seguenti tipi di errori in varie fasi del processo di compilazione. Esistono cinque metodi comuni di ripristino degli errori che possono essere implementati nel parser
Ripristino in modalità istruzione
- Nel caso in cui il parser riscontri un errore, ti aiuta a prendere misure correttive. Ciò consente al resto degli input e degli stati di analizzare in anticipo.
- Ad esempio, l'aggiunta di un punto e virgola mancante è disponibile nel metodo di ripristino in modalità istruzione. Tuttavia, il progettista di analisi deve fare attenzione mentre apporta queste modifiche poiché una correzione errata può portare a un ciclo infinito.
Ripristino in modalità antipanico
- Nel caso in cui il parser riscontri un errore, questa modalità ignora il resto dell'istruzione e non elabora l'input dall'input errato al delimitatore, come un punto e virgola. Questo è un semplice metodo di recupero dagli errori.
- In questo tipo di metodo di ripristino, il parser rifiuta i simboli di input uno per uno finché non viene trovato un singolo gruppo designato di token di sincronizzazione. I token di sincronizzazione che utilizzano generalmente delimitatori come o.
Recupero a livello di frase:
- Il compilatore corregge il programma inserendo o eliminando i token. Ciò gli consente di procedere all'analisi da dove si trovava. Esegue la correzione sull'input rimanente. Può sostituire un prefisso dell'input rimanente con una stringa che aiuta il parser a continuare il processo.
Produzioni di errore
- Il ripristino della produzione di errori espande la grammatica per la lingua che genera i costrutti errati. Il parser quindi esegue la diagnostica degli errori su quel costrutto.
Correzione globale:
- Il compilatore dovrebbe apportare il minor numero di modifiche possibile durante l'elaborazione di una stringa di input errata. Data una stringa di input errata a e la grammatica c, gli algoritmi cercheranno un albero di analisi per una stringa correlata b. Come alcuni inserimenti, eliminazioni e modifiche apportate ai token necessari per trasformare an in b è il meno possibile.
Grammatica:
Una grammatica è un insieme di regole strutturali che descrivono una lingua. Le grammatiche assegnano la struttura a qualsiasi frase. Questo termine si riferisce anche allo studio di queste regole e questo file include morfologia, fonologia e sintassi. È in grado di descrivere molte delle sintassi dei linguaggi di programmazione.
Regole di forma grammaticale
- Il simbolo non terminale dovrebbe apparire a sinistra di almeno una produzione
- Il simbolo dell'obiettivo non dovrebbe mai essere visualizzato a destra di :: = di qualsiasi produzione
- Una regola è ricorsiva se LHS appare nel suo RHS
Convenzioni notazionali
Il simbolo delle convenzioni notazionali può essere indicato racchiudendo l'elemento tra parentesi quadre. È una sequenza arbitraria di istanze dell'elemento che può essere indicata racchiudendo l'elemento tra parentesi graffe seguite da un asterisco, {…} *.
È una scelta dell'alternativa che può utilizzare il simbolo all'interno della singola regola. Può essere racchiuso tra parentesi ([,]) quando necessario.
Due tipi di convenzioni notazionali area Terminal e Non terminal
1. terminali:
- Lettere minuscole dell'alfabeto come a, b, c,
- Simboli operatore come +, -, *, ecc.
- Simboli di punteggiatura come parentesi, cancelletto, virgola
- 0, 1,…, 9 cifre
- Stringhe in grassetto come id o if, qualsiasi cosa che rappresenti un singolo simbolo di terminale
2.Nonterminali:
- Lettere maiuscole come A, B, C
- Nomi in corsivo minuscolo: l'espressione o alcuni
Grammatica libera dal contesto
Un CFG è una grammatica ricorsiva a sinistra che ha almeno una produzione del tipo. Le regole in una grammatica libera dal contesto sono principalmente ricorsive. Un analizzatore di sintassi verifica che il programma specifico soddisfi o meno tutte le regole della grammatica libera dal contesto. Se soddisfa, questi analizzatori di sintassi delle regole possono creare un albero di analisi per quel programma.
expression -> expression -+ termexpression -> expression - termexpression-> termterm -> term * factorterm -> expression/ factorterm -> factor factorfactor -> ( expression )factor -> id
Derivazione grammaticale
La derivazione grammaticale è una sequenza di regole grammaticali che trasforma il simbolo di inizio nella stringa. Una derivazione dimostra che la stringa appartiene alla lingua della grammatica.
Derivazione più a sinistra
Quando la forma di input sentenziale viene scansionata e sostituita nella sequenza da sinistra a destra, è nota come derivazione più a sinistra. La forma sentenziale che è derivata dalla derivazione più a sinistra è chiamata la forma sentenziale a sinistra.
Derivazione più a destra
La derivazione più a destra esegue la scansione e sostituisce l'input con le regole di produzione, da destra a sinistra, sequenza. È noto come derivazione più a destra. La forma sentenziale che deriva dalla derivazione più a destra è nota come forma sentenziale a destra.
Sintassi vs. analizzatore lessicale
Analizzatore di sintassi |
Analizzatore lessicale |
L'analizzatore di sintassi si occupa principalmente di costrutti ricorsivi del linguaggio. |
L'analizzatore lessicale semplifica il compito dell'analizzatore di sintassi. |
L'analizzatore di sintassi funziona sui token in un programma sorgente per riconoscere strutture significative nel linguaggio di programmazione. |
L'analizzatore lessicale riconosce il token in un programma sorgente. |
Riceve input, sotto forma di token, da analizzatori lessicali. |
È responsabile della validità di un token fornito da l'analizzatore di sintassi |
Svantaggi dell'utilizzo degli analizzatori di sintassi
- Non determinerà mai se un token è valido o meno
- Non ti aiuta a determinare se un'operazione eseguita su un tipo di token è valida o meno
- Non puoi decidere che il token viene dichiarato e inizializzato prima di essere utilizzato
Sommario
- L'analisi della sintassi è una seconda fase del processo di progettazione del compilatore che segue l'analisi lessicale
- L'analizzatore sintattico ti aiuta ad applicare le regole al codice
- Frase, lessema, token, parole chiave e parole riservate, parole non significative, commenti, delimitatori, set di caratteri, identificatori sono alcuni termini importanti utilizzati nell'analisi della sintassi nella costruzione del compilatore
- Parse controlla che la stringa di input sia ben formata e, in caso contrario, la rifiuta
- Le tecniche di analisi sono divise in due diversi gruppi: analisi dall'alto verso il basso, analisi dal basso verso l'alto
- Lessico, sintattico, semantico e logico sono alcuni errori comuni che si verificano durante il metodo di analisi
- Una grammatica è un insieme di regole strutturali che descrivono una lingua
- Il simbolo delle convenzioni notazionali può essere indicato racchiudendo l'elemento tra parentesi quadre
- Un CFG è una grammatica ricorsiva a sinistra che ha almeno una produzione del tipo
- La derivazione grammaticale è una sequenza di regole grammaticali che trasforma il simbolo di inizio nella stringa
- L'analizzatore di sintassi si occupa principalmente di costrutti ricorsivi del linguaggio mentre l'analizzatore lessicale facilita il compito dell'analizzatore di sintassi nel DBMS
- Lo svantaggio del metodo dell'analizzatore di sintassi è che non determinerà mai se un token è valido o meno