Analizzatore lessicale o scanner



Похожие документы
Analizzatore lessicale o scanner. Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser.

Dispensa YACC: generalità

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

Introduzione alla programmazione in C

Corso di Informatica

Fasi di creazione di un programma

Capitolo Quarto...2 Le direttive di assemblaggio di ASM Premessa Program Location Counter e direttiva ORG

Trattamento degli errori

Linguaggi e Paradigmi di Programmazione

Linguaggi per COMUNICARE. Il linguaggio è un sistema codificato di segni che consente la comunicazione, intesa come scambio di informazioni

Metodologie di programmazione in Fortran 90

Linguaggi di programmazione

Appunti del corso di Informatica 1 (IN110 Fondamenti) 2 Algoritmi e diagrammi di flusso

Lezione 8. La macchina universale

Progetto Automi e Linguaggi Parser svliluppato con JLex e cup

Esempi di algoritmi. Lezione III

Appunti del corso di Informatica 1 (IN110 Fondamenti) 4 Linguaggi di programmazione

Algoritmi e diagrammi di flusso

MATLAB. Caratteristiche. Dati. Esempio di programma MATLAB. a = [1 2 3; 4 5 6; 7 8 9]; b = [1 2 3] ; c = a*b; c

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

con ANTLR tesi di laurea Anno Accademico Relatore Ch.mo prof. Porfirio Tramontana Candidato Fabio Canova Matr

Funzioni in C. Violetta Lonati

LINGUAGGI DI PROGRAMMAZIONE LINGUAGGI DI BASSO LIVELLO

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA

LINGUAGGI DI PROGRAMMAZIONE

Macchine a stati finiti. Sommario. Sommario. M. Favalli. 5th June 2007

Nozione di algoritmo. Gabriella Trucco

Macchine a stati finiti. Sommario. Sommario. M. Favalli. Le macchine a stati si utilizzano per modellare di sistemi fisici caratterizzabili mediante:

Programmazione in Java (I modulo) Lezione 3: Prime nozioni

Introduzione. Informatica B. Daniele Loiacono

Elementi di semantica operazionale

Risolvere un problema significa individuare un procedimento che permetta di arrivare al risultato partendo dai dati

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Gli algoritmi: definizioni e proprietà

Studente: SANTORO MC. Matricola : 528

Dispensa di Informatica I.1

Macchine a stati finiti G. MARSELLA UNIVERSITÀ DEL SALENTO

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Come ragiona il computer. Problemi e algoritmi

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Corso di Informatica

Semantica operazionale dei linguaggi di Programmazione

Alfabeto ed elementi lessicali del linguaggio C

Progettaz. e sviluppo Data Base

Struttura di un programma Java

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Dispense del corso di Introduzione all Informatica della Facoltà Di Scienze Matematiche, Fisiche e Naturali dell Università della Calabria

Arduino: Programmazione

Semantica dei programmi. La semantica dei programmi è la caratterizzazione matematica dei possibili comportamenti di un programma.

RAPPRESENTAZIONE GRAFICA DEGLI ALGORITMI

Modellazione di sistema

Variabili e tipi di dato

Descrizione di un algoritmo

Linguaggi di programmazione

Cenni su algoritmi, diagrammi di flusso, strutture di controllo

Programmazione in Java Parte I: Fondamenti

Esercitazione N7:Gioco dei 21 fiammiferi (impariamo java giocando)

AA LA RICORSIONE

Appunti del corso di Informatica 1 (IN1 Fondamenti) 2 Introduzione alla programmazione

Stefania Marrara - Esercitazioni di Tecnologie dei Sistemi Informativi. Integrazione di dati di sorgenti diverse

Librerie digitali. Video. Gestione di video. Caratteristiche dei video. Video. Metadati associati ai video. Metadati associati ai video

Fogli Elettronici: MS Excel

Concetto di Funzione e Procedura METODI in Java

ALGORITMI e PROGRAMMI Programmazione: Lavoro che si fa per costruire sequenze di istruzioni (operazioni) adatte a svolgere un dato calcolo

Esercizi di JavaScript

Verifica che una grammatica sia Context Free nel GrammaReader

Linguaggi formali e compilazione

E possibile modificare la lingua dei testi dell interfaccia utente, se in inglese o in italiano, dal menu [Tools

Codifica: dal diagramma a blocchi al linguaggio C++

DI D AGRA R MM M I M A BLOCC C H C I TEORI R A E D D E SERC R I C ZI 1 1

Sistemi Operativi. 5 Gestione della memoria

Al termine del lavoro ad uno dei componenti del gruppo verrà affidato l incarico di relazionare a nome di tutto il gruppo.

4 3 4 = 4 x x x 10 0 aaa

Semantica Assiomatica

Prof. Giuseppe Chiumeo. Avete già studiato che qualsiasi algoritmo appropriato può essere scritto utilizzando soltanto tre strutture di base:

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione

Sistemi Operativi. Interfaccia del File System FILE SYSTEM : INTERFACCIA. Concetto di File. Metodi di Accesso. Struttura delle Directory

Appunti di Sistemi Elettronici

Università degli Studi di Ferrara - A.A. 2014/15 Dott. Valerio Muzzioli ORDINAMENTO DEI DATI

DAL PROBLEMA ALL'ALGORITMO AL PROGRAMMA SCRITTO IN Come. Scopo principale dell informatica è risolvere problemi con i calcolatori.

Organizzazione degli archivi

INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI

SOFTWARE. È l insieme delle istruzioni che è necessario fornire alla macchina per il suo funzionamento. Vi sono due categorie di software:

Ricorsione. Rosario Culmone. - p. 1/13

Inizializzazione, Assegnamento e Distruzione di Classi

GESTIONE INFORMATICA DEI DATI AZIENDALI

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Gestione della memoria. Paginazione Segmentazione Segmentazione con paginazione

Fondamenti di Programmazione

A intervalli regolari ogni router manda la sua tabella a tutti i vicini, e riceve quelle dei vicini.

INFORMATICA GENERALE. Prof Alberto Postiglione Dipartim. Scienze della Comunicazione Univ. Salerno. Università degli Studi di Salerno

Gestione del workflow

Cosa è un foglio elettronico

Il sapere tende oggi a caratterizzarsi non più come un insieme di contenuti ma come un insieme di metodi e di strategie per risolvere problemi.

Cosa significa che il SW è non lineare? Piccoli cambiamenti nel codice portano a grandi cambiamenti di comportamento

Informatica 3. Informatica 3. LEZIONE 10: Introduzione agli algoritmi e alle strutture dati. Lezione 10 - Modulo 1. Importanza delle strutture dati

CAPITOLO 7 - SCAMBIO DI MESSAGGI

Транскрипт:

Analizzatore lessicale o scanner Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser. Lo scanner, attraverso un esame carattere per carattere dell'ingresso, separa il programma sorgente in parti chiamate token che rappresentano i nomi delle variabili, operatori, label, ecc. Il parser genera un albero sintattico le cui foglie sono i simboli terminali della grammatica, ovvero i token che lo scanner ha estratto dal programma sorgente e passato al parser. Il parser potrebbe fare direttamente anche l analisi sintattica, ma non è conveniente in quanto la grammatica per i token è una grammatica regolare più semplice quindi di quella che tratta il parser. Lo scanner può interagire con il parser in due modi differenti: - Lavorare in un passo separato, producendo i token in una grossa tabella in memoria di massa; - Interagire direttamente con il parser che chiama lo scanner quando è necessario il prossimo token nell'analisi sintattica (preferibile). Lo scanner suddivide il programma sorgente in token. Il tipo di token è rappresentato con un numero intero unico (esempio, variabile con il numero 1, costante 2, label 3). Il token, che è una stringa di caratteri, è memorizzato in una tabella. I valori delle costanti sono memorizzati in una constant table, mentre i nomi delle variabili in una symbol table. Esempio: SUM: A=A+B; GOTO DONE; Output dello scanner: Token Rapp. Interna Locazione SUM 3 1 : 11 0 A 1 2 = 6 0 A 1 2 + 5 0 B 1 3 ; 12 0 GOTO 4 0 DONE 3 4 ; 12 0 Si noti che gli spazi bianchi sono stati ignorati dallo scanner.

Il Progetto di uno Scanner e la sua Realizzazione Compiti: - Eliminare spazi bianchi, commenti ecc;ù - Isolare il prossimo token dalla sequenza di caratteri in input; - Isolare identificatori e parole-chiave; - Generare la symbol-table. I token possono essere descritti in diversi modi. Spesso si utilizzano le grammatiche regolari. Esempio: Grammatica regolare per generare i numeri naturali: <unsigned integer>::= 0 1 2 3 4 5 6 7 8 9 0<unsigned integer> 1<unsigned integer> 9<unsigned integer> Un altro modo per descrivere i token è in modo riconoscitivo piuttosto che generativo mediante automi a stati finiti. Esempio di applicazione: Diagramma a stati finiti per un linguaggio che consiste dei token <, <=, =, >=, >, <>, (, ), +, -, *, /, :=, ;, identificatori, parole chiave, costanti, e stringhe (fra apici). Commenti (/* e */) o spazi bianchi sono ignorati. Algoritmo: Implementa lo scanner specificato dall'automa a stati finiti seguente. Procedure SCAN(PROGRAM, LOOKAHEAD, CHAR TOKEN, POS) Data la stringa sorgente PROGRAM, questo algoritmo ritorna il numero di rappresentazione interna del TOKEN successivo nella stringa. Se TOKEN rappresenta un identificatore, stringa o costante, la procedura ritorna anche la sua posizione numerica nella tabella POS. CHAR rappresenta il carattere corrente su cui si sta facendo lo scanner. LOOKAHEAD è una variabile logica che ci dice se il simbolo in CHAR è stato usato nella chiamata precedente a SCAN. Un valore "false" denota che non è stato ancora controllato.

L algoritmo utilizza le seguenti funzioni: GET_CHAR(PROGRAM) che ritorna il prossimo carattere del programma sorgente; INSERT(STRING,type) che inserisce un dato token STRING (se necessario) ed il suo tipo (cioè costante, stringa o variabile) nella tabella dei simboli; KEYWORD(STRING) che ritorna il numero di rappresentazione interna del suo argomento se è una keyword, 0 altrimenti. STRING contiene il token corrente (nome di variabile, costante, stringa). Le variabili DIVISION, LEQ, NEQ, LTN, GEQ, GTN, EQ, LEFT, RIGHT, ADDITION, SUBTRACTION, MULIPLICATION, ASSIGNMENT, SEMICOLON, LITERAL, IDENTIFIER e CONSTANT contengono i numeri interni di rappresentazione dei token /, <=, <>,<,>=, >, =, (, ), +, -, ~, :=, ;, stringhe, identificatori e costanti rispettivamente.

Nota: In alcuni linguaggi non è possibile determinare sempre cos è un token nel momento in cui è stato letto completamente. Esempio: FORTRAN (i bianchi sono ignorati completamente): DO10I = 1,20 DO10I=1+20 Il primo è l'inizio di un loop e DO1OI consiste dei tre token DO, 10 e I, mentre nel secondo DO10I è un identificatore. Si deve risolvere il problema andando avanti fino a che l'ambiguità è risolta.

I linguaggi regolari vengono riconosciuti in modo efficiente attraverso automi a stati finiti. Tuttavia, sono linguaggi abbastanza limitati e con le loro grammatiche non si possono descrivere anche semplici costrutti dei linguaggi di programmazione. L'utilizzo delle grammatiche regolari è perciò limitato alla costruzione (e riconoscimento) dei simboli base usati in un programma (quello che si indica generalmente come lessico), ad esempio gli identificatori. Il riconoscimento di tali simboli base è la prima fase eseguita durante la compilazione di un programma e prende il nome di analisi lessicale. Una volta terminata l'analisi lessicale sono stati individuati, ad esempio, le costanti, le variabili, etc. utilizzate nel programma e costruita quella che si chiama tabella dei simboli. L'analisi del programma prosegue poi con tecniche più complesse (analisi sintattica e analisi semantica). Le grammatiche regolari possono essere usate per rappresentare scanner che sono implementati come automi a stati finiti. Poichè realizzare un automa a stati finiti è banale sono stati progettati programmi in grado di generare automaticamente degli scanner usando un metodo formale per specificare l automa a stati finiti. Un noto generatore di scanner è Lex (1975) che utilizza espressioni regolari per specificare lo scanner. Utilizzando espressioni regolari ed associati segmenti di codice chiamati azioni, Lex genera una tabella delle transizioni e un programma che interpreta tale tabella. L azione è eseguita quando si riconosce un token generato dall'espressione regolare. L'output di Lex è quindi un programma che simula un automa a stati finiti ed esegue le funzioni addizionali associate con le azioni. Lo scanner generato da Lex può essere usato in congiunzione con un parser (YACC) per eseguire sia l'analisi lessicale che sintattica.