Parser Bottom UP. Giuseppe Morelli

Похожие документы
Linguaggi formali e compilazione

Pumping lemma per i linguaggi Context-free

Dispensa 1. Da un punto di vista logico l architettura di un compilatore si può suddividere in due parti: Analisi e Sintesi.

Forma Normale di Chomsky

Analisi sintattica (parser)

Forme Normali. Forma normale di Chomsky. E caratterizzata da regole di due tipi. A! BC dove A, B, C $ V N A! a con a $ V T. Forma normale di Greibach

Linguaggi di Programmazione Corso C. Parte n.3 Linguaggi Liberi da Contesto e Linguaggi Contestuali. Nicola Fanizzi

Linguaggi e Grammatiche Liberi da Contesto

Contenuti del corso. Parsing: esempio. Cosa aggiungiamo in questo corso. Parsing. Data una grammatica: E T T + E

Espressività e limitazioni delle grammatiche regolari

Dispensa YACC: generalità

Grammatiche. Grammatiche libere da contesto Grammatiche regolari Potenza delle grammatiche libere e regolari Struttura di frase: Alberi di derivazione

Definizione di Grammatica

PROLOG E ANALISI SINTATTICA DEI LINGUAGGI Quando si vuole definire in modo preciso la sintassi di un linguaggio si ricorre a una grammatica G=(V n,v t

Grammatiche context-free

acuradi Luca Cabibbo e Walter Didimo Esercizi di Informatica teorica - Luca Cabibbo e Walter Didimo 1

Il Modello di un Compilatore. La costruzione di un compilatore per un particolare linguaggio di programmazione e' abbastanza complessa.

Trattamento degli errori

Esercizi di Algoritmi e Strutture Dati

Codifica di Huffman e Lempel-Ziv-Welch A L B E R T O B E L U S S I A N N O A C C A D E M I C O /

Esercizi su Python. 14 maggio Scrivere una procedura che generi una stringa di 100 interi casuali tra 1 e 1000 e che:

TRIE (albero digitale di ricerca)

Corso di Linguaggi di Programmazione

Esercizi su algebra lineare, fattorizzazione LU e risoluzione di sistemi lineari

Verificare se una grammatica e LL(1) e costruirne la tabella di parsing. Verificare se una grammatica e LR(0) e costruirne la tabele ACTION e GOTO

9. CALCOLO INTEGRALE: L INTEGRALE INDEFINITO

Rappresentazione con i diagrammi di flusso (Flow - chart)

Video Scrittura (MS Word) Lezione 3 Formattazione e Stampa documenti

Le grammatiche formali

Linguaggi di programmazione - Principi e paradigmi 2/ed Maurizio Gabbrielli, Simone Martini Copyright The McGraw-Hill Companies srl

Esercitazioni di Reti Logiche. Lezione 5

Logica proposizionale

Capitolo 1 Vettori applicati e geometria dello spazio

Linguaggi Regolari e Linguaggi Liberi

Sistemi lineari. Lorenzo Pareschi. Dipartimento di Matematica & Facoltá di Architettura Universitá di Ferrara

ESERCIZI SUI PUNTI DI NON DERIVABILITÀ TRATTI DA TEMI D ESAME

Scopo della trigonometria è la risoluzione di un triangolo a partire da un numero minimo di informazioni sul triangolo steso che come sappiamo è 3.

Stabilità e retroazione

Cosa è l Informatica?

Grammatiche Parse trees Lezione del 17/10/2012

Soluzione/* PROGRAMMAZIONE IN C */ #include <stdio.h> #include <stdlib.h>

Informatica Generale Homework di Recupero 2016

Turing, i nastri e le macchine

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Algoritmi e soluzione di problemi

2. APPUNTI SUI FASCI DI CIRCONFERENZE (raccolti dal prof. G. Traversi)

Analizzatore lessicale o scanner. Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser.

Le quattro operazioni fondamentali

Fasi di un Compilatore

Linguaggi e tecnologie per il Web

Aritmetica dei Calcolatori Elettronici

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Esercitazioni di Reti Logiche

Corso di Linguaggi di Programmazione + Laboratorio Docente: Marco de Gemmis

Raggiungibilità, Controllabilità, Osservabilità e Determinabilità

In questo articolo descriveremo le formule da applicare alle seguenti operazioni sulle stringhe di testo:

CIRCUITI IN CORRENTE CONTINUA

Alberi binari e alberi binari di ricerca

Linguaggi di Programmazione

Moltiplicazione. Divisione. Multipli e divisori

ALGEBRA LINEARE PARTE II

Algebra di Boole Cenni all Algebra di Boole

Macchine di Turing. Francesco Paoli. Istituzioni di logica, Francesco Paoli (Istituzioni di logica, ) Macchine di Turing 1 / 29

Macchina di Turing ... !!... !!! a b b! b a! Nastro di Input. testina. s t q i. s r. Unità di Controllo q j S / D / F

Espressioni regolari

Rappresentazioni numeriche

1 Primitive e integrali indefiniti

LEZIONE 4. { x + y + z = 1 x y + 2z = 3

Lezioni del corso di Progetto di Linguaggi e Traduttori

La codifica digitale

2) Codici univocamente decifrabili e codici a prefisso.

Appunti di Elettronica I Lezione 3 Risoluzione dei circuiti elettrici; serie e parallelo di bipoli

Esercizi di Fondamenti di Informatica per la sicurezza. Stefano Ferrari

Il Sistema di numerazione decimale

Linguaggi Regolari e Linguaggi Liberi

1. Serie, parallelo e partitori. ES Calcolare la

Logica proposizionale

Traduzione guidata dalla sintassi

Le quattro operazioni fondamentali

Funzioni Pari e Dispari

ELEMENTI di TEORIA degli INSIEMI

Транскрипт:

Parser Bottom UP Giuseppe Morelli

Parser Bottom UP Un parser Bottom Up lavora costruendo il corrispondente albero di parsing per una data stringa di input partendo dalle foglie (bottom) e risalendo via visa verso la radice (top).

Nel seguito verranno trattati parser bottom up noti come Shift-Reduce parser. Sono in grado di costruire grammatiche chiamate LR. La costruzione di parser LR è alquanto complessa; Esistono tuttavia generatori automatici di parser in grado di costruire parser LR efficienti

Riduzioni Il parsing Bottom Up può essere pensato come il processo di riduzione di un data stringa w al simbolo iniziale della grammatica. Ad ogni passo della riduzione uno specifica sottostringa che coincide con il corpo di una produzione è sostituita da il simbolo non terminale della testa della produzione stessa. Durante il parsing è fattore chiave riuscire a determinare quando effetturare una riduzione e quale produzione applicare affinchè il parsing possa proseguire

Ritornando all esempio: La sequenza di riduzioni applicate può essere codificata attraverso: NOTA: Dopo le prime due riduzioni (F->id; T->F) si potrebbe Ridurre T attraverso E->T oppure id (di destra) attraverso F -> id

Per definizione una riduzione è il passo inverso della procedura di derivazione (attraverso la quale un non terminale era sostituito dal corpo di una produzione, durante la generazione di una stringa). Lo scopo del parsing bottom-up è costruire un darivazione al contrario (in senso inverso). Derivazione Riduzione

Esempio Si consideri la grammatica S -> aabe A -> Abc b B -> d E l input: abbcde Riduzione: abbcde (A->b A->Abc B->d S->aABe) abbcde, aabcde, aade, aabe, S Derivazione S => aabe => aade => aabcde => abbcde

Per ottenere una riduzione al simbolo iniziale attraverso l inversa di una derivazione è necessario essere in grado di riconoscere gli handles(maniglie) delle varie forme proposizionali. Un handle è una sottostringa che coincide con il corpo di una produzione e la cui riduzione rappresenta un passo lungo il processo di derivazione destra inverso Esempio precedente i simboli sottolineati sono handles

Data una forma proposizionale destra γ un handle per γ è una produzione A -> β ed una posizione in γ corrispondente ad una occorrenza di β tale che rimpiazzando β con A si ottiene ancora una forma sentenziale destra che precede immediatamente γ in una derivazione destra per γ. o equivalentemente Se S => αaw => αβw allora la produzione A->β nella posizione seguente ad α è un handle di αβw.

NOTE Alla destra dell handle la stringa w è fatta solo di simboli terminali Se una grammatica è non ambigua ogni forma sentenziale destra avrà solo un handle (ovvero le derivazioni destre sono univocamente determinte) Sebbene formalmente un handle è una produzione spesso ci si riferirà solo al suo body

Esempi. Si consideri la stringa id+id*id e la grammatica: E -> E+E E*E (E) id id+id*id => E + id * id => E+E*id => E+E*E => E+E => E id+id*id =>E+id*id =>E+E *id => E*id => E*E => E

L inversa di una derivazione destra può essere ottenuta attraverso un procediemento di potatura degli handle (handle pruning).

Si parte dalla stringa di terminali w da ridurre; se w è una frase della grammatica(sentence: derivazione ovvero forma sentenziale con soli terminali) allora sia w =γn dove γn è n-esima forma sentenziale destra di una derivazione destra Per ricostruire la derivazione nell ordine inverso: localizzare l handle βn in γn e rimpiazzare βn con la testa della produzione An -> βn per ottenere la forma sentenziale γn-1. Si continua trovando βn-1 in γn-1. fino ad arrivare al simbolo iniziale. La sequenza delle produzioni utilizzate (in ordine inverso) rappresenta la derivazione destra per la stringa di input

Shift- Reduce parser Per una corretta potatura dell albero si devono affrontare e risolvere due problemi: 1. Bisogna essere in grado di localizzare la sottostringa da ridurre 2. Bisogna determinare quale produzione utilizzare nella riduzione Tali problemi possono essere affrontati utilizzando: Uno stack per contenere i simboli della grammatica ovvero un prefisso della forma sentenziale destra fino ad un handle Un buffer di input per contenere la porzione di input di cui ancora si deve fare il parsing.

Convenzionalmente il $ indica sia il top dello stack sia la destra della stringa di input Inizialmente stack vuoto e stringa w si indicherà con: Durante il processo di analisi della stringa di input da sinistra a destra, il parser muoverà 0 o più simboli nello stack fino a quando non sarà in grado di ridurre una stringa della grammatica (corpo della produzione) con il top dello stack (sostituisce top con non terminale testa della produzione). La fine senza errori è determinata dalla presenza del simbolo iniziale nello stack, con buffer di input vuoto.

Operazioni di un parser Shift Reduce. Shift: sposta il successivo simbolo di input nello stack Reduce: riduzione dell handle sullo stack (top) mediante una opportuna produzione. Sostituzione dell handle con un non terminale Accept: Segnalazione che il parsing si è concluso con successo Error: Segnalare errore di sintatti e richiamare una opportuna procedure di recovery.

Esempio E -> E + E E -> E * E E -> (E) E -> id STACK $ $ id $ E $ E + id $ E + E $ E + E id $ E + E E $ E + E $ E INPUT id + id id $ + id id $ + id id $ * id $ * id $ $ $ $ $ AZIONE SHIFT REDUCE E id SHIFT, SHIFT REDUCE E id SHIFT, SHIFT (perché NON REDUCE E E + E) REDUCE E id E E E E E + E ACCEPT

Handle e top dello stack Due passi successivi di una derivazione destra possono essere di due forme differenti: βby sostiuisce A e B (terminale più a destra) è sostituito da γ Considerando in senso inverso ad un dato istante lo stack sarà si riduce γ con B Shift y, riduce βby con A.

La seconda forma prevede: A è epanso per primo con y fatto solo di terminali; mentre qualche terminale B sta a sinistra di y con handle γ Considerando in senso inverso ad un dato istante lo stack sarà:---- Si riduce γ con B shiftano x e y; ridurre y con A

Conflitti Un parser shift-reduce può raggiungere una configurazione in cui, pur conoscendo lo stack nella sua interezza ed i simboli di input da trattare, non sa decidere se: Effettaure una operazione di SHIFT o di REDUCE (conflitto Shift/Reduce) Scegliere fra più riduzioni possibili quale effettuare (conflitto Reduce/Reduce)

Esempio Quando il parser è nella seguente configurazione: Non è possibile determinare se nello stack c è un handle oppure no quindi se fare un o shift o una riduzione

Esempio Quando il parser è nella seguente configurazione: Non sappiamo decidere quale riduzione fare tra (5) e (7) Se invece di id per array e procedure il lexer restituisce risp. id e procid per i costrutti