Analizzatore lessicale

Documenti analoghi
Definizioni syntax-directed

Linguaggi e Ambienti di Programmazione

Analizzatore Lessicale Parte I Scanner

Automa deterministico con prospezione 1. < {q}, Σ, Σ V, δ, q, S, Φ > δ(a, X) = α R. se a Gui(X α) senza spostamento della testina.

Fasi di un Compilatore

File. var nome: file of tipo; FILE *puntatore;

Linguaggi e Traduttori: Analisi lessicale

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

Traduzione guidata dalla sintassi. Attributi e Definizioni guidate dalla sintassi

Intro. Traduzione guidata dalla sintassi. Attributi. Due notazioni a diversi livelli. Due notazioni a diversi livelli. Il flusso concettuale

Traduzione guidata dalla sintassi

Analisi Lessicale. File

Analisi lessicale (scanner)

Analizzatori Lessicali con JLex. Giuseppe Morelli

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Analisi lessicale (scanner)

Implementazione di DFA in C

Il linguaggio C. Istruzioni, funzioni, dati strutturati

Analizzatori sintattici a discesa ricorsiva

Laboratorio di Programmazione(corso A) Laurea in Informatica - A.A. 2000/2001 Docente: A. Lanza

Automi e Linguaggi Formali

POLITECNICO DI TORINO. Laboratorio di Compilatori Corso di Linguaggi e Traduttori. Esercitazione 5. a.a 2010 / Controllo dei tipi

Laboratorio di Informatica I

Esercizio 1. a * 10 + (20 b) a b. Tecnologie dei Linguaggi Artificiali Esercizi Yacc

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Struttura di un programma Java

Tela (Teaching Language)

Il C nel C++ Struttura di un linguaggio. regole per la definizione i simboli. regole per la composizione dei simboli

Struttura di un linguaggio

Informatica Generale Andrea Corradini Ancora sui linguaggi di programmazione

Il C nel C++ Struttura di un linguaggio. Elementi lessicali. Spazi. Livello lessicale: Livello sintattico: Livello semantico:

Algoritmi e Strutture di Dati

Il tutto sarà ripreso all inizio della prossima lezione e rivisto assieme

Progetto per il Laboratorio di Programmazione Un interprete per il linguaggio PINO. Modulo I: Le tavole dei simboli (TS)

Corso di Informatica

Un esempio di compilatore realizzato con flex e bison

JavaScript Core Language. Prof. Francesco Accarino IIS Atiero Spinelli Sesto San Giovanni via leopardi 132

Parametri passati per indirizzo. Puntatori Vogliamo modificare la parte del codice di bubble che realizza lo scambio dei valori:

L utility Unix awk [Aho-Weinberger-Kernighan]

Variabili e Funzioni. Informatica 1 / 19

ANALISI SINTATTICA LUCIDI DI F. D'AMORE E A. MARCHETTI SPACCAMELA

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

Programmazione lato client. JavaScript. Applicazioni di Rete M. Ribaudo - DISI. JavaScript

Funzioni, Stack e Visibilità delle Variabili in C

Esercitazioni di Fondamenti di Informatica - Lez. 9 4/12/2018

Corso di Laboratorio di Sistemi Operativi

Dati due punti sul piano calcolare la loro distanza

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

Yet Another Compiler-Compiler. Generazione automatica di analizzatori sintattici

Metodi statici. Dichiarazione e chiamata di metodi statici

ciclo di vita della soluzione (informatica) di un problema

JavaScript JavaScript Programmazione lato client JScript JavaScript ECMAScript

Informatica 3. LEZIONE 2: Sintassi e semantica

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Il primo programma C++

Informatica 3. Informatica 3. LEZIONE 2: Sintassi e semantica. Lezione 2- Modulo 1. Le componenti di un linguaggio di programmazione

Costruzione dell insieme dei Follow

Laboratorio di Programmazione

Realizzare un programma

Corso di laurea in Informatica (Triennale) A.A. 2002/ 03 Corso di Programmazione (C) Docente: S. Ferilli II esonero (16 dicembre 02)

Perché il linguaggio C?

Assegnazione di una variabile

Scopo del progetto è la costruzione di un compilatore per il linguaggio descritto qui di seguito.

Octave. Luca Abeni. Informatica Luca Abeni 1 / 21

Lezione 6 Introduzione al C++ Mauro Piccolo

Algoritmi, Strutture Dati e Programmi. UD 2.b: Programmazione in Pascal

non serve che la seconda condizione sia composta

Gestione di files Motivazioni

Ingredienti sintattici di Java

Funzioni, Stack e Visibilità delle Variabili in C

Le basi del linguaggio Java

La Programmazione. Cos è la programmazione? Concetti preliminari

Linguaggi e Traduttori Esercitazione di laboratorio N.2 - soluzione

Automi e Linguaggi Formali

Linguaggi e Traduttori

Laboratorio Progettazione Web Le funzioni in PHP. Angelica Lo Duca IIT-CNR 2012/2013

Corso di Fondamenti di Informatica Linguaggi di Programmazione

La sintassi del C APPENDICE H

Premessa. Input /output e gestione dei file. I file e gli stream. Il puntatore al file. 21. I FILE NEL LINGUAGGIO C Versione 1.

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Input/Output di numeri

Perché il linguaggio C?

Manualistica 3 Le strutture di controllo

Progetto Laboratorio Programmazione Parte 2: Analizzatore sintattico di espressioni

Allocazione dinamica della memoria

Cognome-Nome:... Matricola...

Il linguaggio Java Istruzioni di Controllo

Programmazione I Prova scritta - 10 gennaio h20min

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Programmazione Procedurale in Linguaggio C++

Analisi sintattica. Analisi sintattica

Metodi statci. Dichiarazione e chiamata di metodi statci

Dal linguaggio macchina al linguaggio C

L utility Unix awk [Aho-Weinberger-Kernighan]

Progetto per il Laboratorio di Programmazione Un interprete per il linguaggio PINO. Modulo II: L analizzatore lessicale (AL)

Sistemi Operativi (M. Cesati)

Introduzione alla programmazione nella shell di Unix 10 Maggio 2005

Transcript:

Analizzatore lessicale Legge la stringa in input e la trasforma in un flusso di token da sottoporre all analizzatore sintattico. Le frasi di un linguaggio sono stringhe di token (simboli atomici). Richieste per l analizzatore lessicale: 1. Rimuovere spazi, tabulazioni, a capo,... 2. Raccogliere i digit in interi, in modo che nella parsificazione i numeri siano trattati come elementi atomici: 3 + 25 2 <num, 3> <+, > < num, 25> <-, > < num, 2>

3. Riconoscere parole chiave e identificatori: count = count + inc id = id + id Per l analisi sintattica non è importante conoscere i lessemi associati ad ogni identificatore, ma lo è per la traduzione. Quando in input viene identificato un lessema, esso viene memorizzato nella symbol table e il puntatore alla entry nella symbol table diventa un attributo del token id. Le parole chiave di solito soddisfano le regole per la costruzione degli identificatori, quindi serve un meccanismo per decidere quando un lessema forma una parola chiave o un identificatore. È più facile se le parole chiave sono riservate: un lessema è un id solo se non è una keyword.

input lettura di un carattere ritorno indietro di un carattere Analizzatore lessicale token e attributi Parsificatore L analizzatore lessicale e il parsificatore formano una coppia produttore consumatore: l analizzatore produce i token e il parsificatore li consuma. Come dimensionare il buffer? Di solito il buffer contiene un token: l interazione può essere implementata con una chiamata da parte del parsificatore della procedura di analisi lessicale, che ritorna i token su richiesta.

Anche per l input di solito viene usato un buffer in cui viene letto un blocco di caratteri alla volta. lettura di un carattere ritorno indietro di un carattere Analizzatore lessicale Restituzione di un token al chiamante tokenval Variabile globale che contiene il valore dell attributo L analizzatore restituisce la codifica del token, di solito un numero maggiore della codifica dei caratteri (256...)

function lexan begin while true do c := readcar if c = or tab then do nothing else if c = newline then lineno := lineno + 1 else if isdigit (c) then costruisci il numero formato da c e dai digit successivi in tokenval return il token num else if isalfa (c) then identifica c e lettere e digit successivi come lessema aggiorna la symbol table... return il token id else tokenval := NONE return c

function lexan begin while true do c := readchar if c = or tab then do nothing else if c = newline then lineno := lineno + 1 else if isdigit (c) then tokenval := c c := readchar while isdigit (c) do tokenval := tokenval * 10 + c c := readchar c := prechar return num...

Operazioni sulla symbol table: insert(s, t): ritorna l indice della nuova entry per la stringa s, token t. lookup(s): ritorna l indice della entry per la stringa s, oppure 0 se la stringa non viene trovata. Si può inizializzare la symbol table con le parole riservate: Insert ( Div, div)

esempio di implementazione: 0 1 2 3 4 ptr token attributi div id id D i v eos c o u n t eos i n c eos

function lexan var lexbuf: array [1.. 100] of char c: char begin while true do c := readchar if c = or tab then do nothing else if c = newline then lineno := lineno + 1 else if isdigit (cc) then...... return num else if c è una lettera then metti cc e lettere e digit successivi in lexbuf aggiorna la symbol table tokenval := il puntatore al lessema return il token id else if c = eof then return DONE else tokenval := NONE return c (l intero che codifica il carattere c)

else if isalpha (c) then b := 0 while isalnum (c) do lexbuf [b] := c c := readchar b := b + 1 if b >= BSIZE then error ( errore di compilazione ) lexbuf [b] := eos c := prechar p := lookup (lexbuf) if p = 0 then p := insert (lexbuf, id) tokenval := p return symtable [p].token

Esempio di traduzione Tradurre in forma postfissa una sequenza di espressioni separate da ; Le espressioni consistono di numeri, identificatori e degli operatori +, -, *, /, Div e Mod. id rappresenta una sequenza non vuota di lettere e digit che iniziano con una lettera. L attributo lessema del token id dà la stringa di caratteri che formano il token. L attributo val del token num fornisce l intero rappresentato da num.

list E ; list list ε E E + T E E-T E T T T * F T T / F T T div F T T mod F T F F ( E ) F id F num print ( + ) print ( - ) print ( * ) print ( / ) print ( Div ) print ( Mod ) print (id.lessema) print (num.val)

list E ; list list ε E E + T E E-T E T T T * F T T / F T T div F T T mod F T F F ( E ) F id F num list E ; list list ε E T R R + T R - T R R ε T F R R * F R / F R R div F R R mod F R R ε F ( E ) F id F num

init lexan symbol parser error emitter main begin init parse {termina con successo}

init: inizializza la symbol table con le keyword error: procedure error (m) print (lineno, m) exit {termina senza successo} lexan: analizzatore lessicale precedente

procedure parse begin cc := lexan list if cc = DONE then successo list E ; list list ε { (, id, num} {DONE} procedure list begin if cc = ( or cc = id or cc = num then cc := lexan E if cc = ; then cc := lexan else error ( errore di sintassi ) list else if cc = DONE then do nothing else error ( errore di sintassi )

procedure parse begin cc := lexan list if cc = DONE then successo procedure list begin if cc = ( or cc = id or cc = num then cc := lexan E if cc = ; then cc := lexan else error ( errore di sintassi ) list else if cc = DONE then do nothing else error ( errore di sintassi ) procedure parse begin cc := lexan while cc DONE do E if cc = ; then cc := lexan else error ( errore di sintassi ) { successo }

Gui(E T R ) = {(, id, num} Gui(R - T R ) = {-} Gui(R + T R ) = {+} Gui(R ε) = {;, )} procedure E begin if cc = ( or cc = id or cc = num then cc := lexan T R else errore ( ) procedure R begin if cc = + or - then cc := lexan T R else if cc = ; or cc = ) then do nothing else errore ( )

procedure E begin T while (cc = + or cc = - ) do cc := lexan T Gui(T T R ) = {(, id, num} Gui(R div F R ) = {div} Gui(R * F R ) = {*} Gui(R mod F R ) = {mod} Gui(R / F R ) = {/} Gui(R ε) = {+, -, ;, )} procedure T begin F while (cc = * or cc = / or cc = div or cc = mod) do cc := lexan F

Gui(F (E) ) = { ( } Gui(F num ) = {num} Gui(F id ) = {id} procedure F begin if cc = ( then cc := lexan E if cc = ) then cc := lexan else error ( errore di sintassi ) else if cc = num then cc := lexan else if cc = id then cc := lexan else error ( errore di sintassi )

list E ; list list ε E T R R + T R R -T R R ε T F R R * F R R / F R R div F R R mod F R R ε F ( E ) F id F num list E ; list list ε E T R R + T {print ( + )} R R - T {print ( - )} R R ε T F R R * F {print ( * )} R R / F {print ( / )} R R div F {print ( Div )} R R mod F {print ( Mod )} R R ε F ( E ) F id {print (id.lessema)} F num {print (num.val)}

procedure E var t begin T while (cc = + or cc = - ) do t := cc cc := lexan T emit (t, NONE)

procedure T var t begin F while (cc = * or cc = / or cc = div or cc = mod) do t := cc cc := lexan F emit (t, NONE)

procedure F begin if cc = ( then cc := lexan E if cc = ) then cc := lexan else error ( errore di sintassi ) else if cc = num then emit (num, tokenval) cc := lexan else if cc = id then emit (id, tokenval) cc := lexan else error ( errore di sintassi )

procedure emit (t, tval) begin if t = + or t = - or t = * or t = / then print (t) else if t = div then print (Div) else if t = mod then print (Mod) else if t = num then print (tval) else if t = id then print (symtable[tval].ptr)