La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Renzi Alberto www.antlr.org. Strumento automatico che permette di generare parser ricorsivi discendenti usando LL(*) (un estensione dellLL(k) che usa.

Presentazioni simili


Presentazione sul tema: "Renzi Alberto www.antlr.org. Strumento automatico che permette di generare parser ricorsivi discendenti usando LL(*) (un estensione dellLL(k) che usa."— Transcript della presentazione:

1 Renzi Alberto

2 Strumento automatico che permette di generare parser ricorsivi discendenti usando LL(*) (un estensione dellLL(k) che usa un lookahead arbitrario per prendere decisioni) Sviluppato in Java permette di generare codice in Java, C#, Python, Ruby, C e C++. Mette a disposizione uno strumento grafico di sviluppo chiamato ANTLR-Works con il quale è possibile anche debuggare I parser generati. Supporta grammatiche EBNF e la generazione di alberi.

3 Questo strumento può produrre in automatico il codice relativo a: Lexer: parte lessicale dove si definiscono i token e i separatori da ignorare Parser: parte grammaticale contenente le regole di produzione TreeParser: un parser che riconosce un albero Ognuno di questi oggetti può contenere azioni semantiche

4 Fasi: Il lexer prepara i token da passare al parser Il parser accetta uno stream dei token preparati dal lexer e cerca di riconoscere la struttura della frase. Se non vengono prodotti AST può semplicemente eseguire azioni in accordo al significato della frase. In alternativa può produrre un albero da passare ad un TreeParser TreeParser: è un parser che accetta un AST che se richiesto viene prodotto dal parser previa descrizione nella grammatica del parser.

5 ANTLR al posto di creare un oggetti stringa per ogni token crea token contenenti i riferimenti che permettono di recuperare il valore del token. Per lAST (nella versione base CommonTree fornita con ANTLR) i nodi possono semplicemente puntare al token dal quale sono stati creati.

6 Sezioni importanti: 1.Dichiarazione del nome della classe che deve perforza coincidere con il nome della grammatica del lexer (in questo caso NostroLexer.g dovrà essere il nome del file che specifica la grammatica del lexer e NostroLexer.java sarà la classe generata) lexer grammar NostroLexer; 2.Nella sezione degli options possiamo indicare il linguaggio di output, in questo caso Java options { language=Java; } 3.Nella possiamo indicare il package e gli import { package miopackage; import java.util.*; } 4.Nella possiamo specificare metodi e variabili che saranno disponibili nella classe { public void metodo() {..... } }

7 Successivamente è possibile elencare i token INT: ('0'..'9')+ ; PLUS: '+' ; COMMENT: '//'(~('\r'|'\n'))+ {skip();}; E i separatori da ignorare: WS : ( ' ' | '\t' | '\r' | '\n' )+ {skip();} ;

8 Sezioni importanti: 1.Come per il lexer il file della grammatica deve incominciare con la dichiarazione del nome del parser: parser grammar NostroParser; 2.Nella sezione degli options possiamo indicare il linguaggio di output, il vocabolario dei token da utilizzare, il K della grammatica e se il parser dovrà generare lAST options { tokenVocab = CalendarLexer; language=Java; k=1; output = AST; } 3.Nella possiamo indicare il package e gli import { package miopackage; import java.util.*; } 4.Nella possiamo specificare metodi e variabili che saranno disponibili nella classe { public void metodo() {..... } }

9 5. Nella possiamo indicare una strategia personalizzata in caso di errore durante il riconoscimento di una { catch (RecognitionException ex) { …. } } 6. Elenco delle produzioni della grammatica (metasimboli in minuscolo, Token in maiuscolo): expr: expr PLUS term | term ; term: term TIMES factor | factor ; factor: INT ;

10 Metasimbolo: {operazioni preliminari} : lato destro della produzione {azioni semantiche} ; Esempio expr returns [int res] {//Eventuali inizializzazioni} : a:expr PLUS b:term {$res = $a+$b;} | c:term {$res = $c} ; E anche possibile associare azioni semantiche per ogni simbolo che si incontra nella parte destra expr returns [int res] {//Eventuali inizializzazioni} : a:expr {$res=$res+$a; } PLUS b:term {$res = $res+$b;} | c:term {$res = $c;} ; Inoltre per accedere al payload di un token richiamando la proprietà.text. term returns [int res] : INT {$res = $INT.text;} ;

11 ANTLR dalla versione 3 da la possibilità di creare alberi omogenei e eterogenei. Per gli alberi omogenei fornisce un implementazione di base chiamata CommonTree con il relativo CommonTreeAdaptor che funge sia da Factory che da Adaptor allo stesso tempo. Per gli alberi eterogenei è necessario implementare linterfaccia TreeAdaptor che da la possibilità ad antlr di poter creare e navigare lalbero senza conoscerne limplementazione.

12 Il tipo di AST generato dal parser avviene indicando per ogni regola il tipo di albero generato. Ciò e possibile specificarlo in due modi allinterno della grammatica del parser: 1.Tramite i simboli ^ e !: Con ^: si indica quale token farà da radice Con !: possiamo indicare i token che non andranno a far parte dellalbero Es la regola width: WIDTH^ DUEP! INT SEMICOLON! ; genera un albero con WIDTH come radice e un solo figlio INT perchè è lunico senza !. 2.Tramite una riscrittura indicata con -> al termine della produzione: width: WIDTH DUEP INT SEMICOLON -> ^(WIDTH INT); dopo la -> si aspetta che si elenchino radice e figli dellalbero ^( radice figlio1 figlio2....)

13 La specifica del TreeParser avviene in modo analogo alla specifica del lexer e del parser con le ecc.. Mentre per le regole della grammatica che descrivono lalbero si possono estrarre dopo aver eseguito un copia e incolla delle regole del parser semplicemente cancellando le regole sintattiche e lasciando solo le riscritture che descrivono lAST: Es. Width: WIDTH^ INT; //Per il primo tipo Width: ^(WIDTH INT); //Per il secondo tipo

14 Antlr site: The Definitive ANTLR Reference, Terence Parr.


Scaricare ppt "Renzi Alberto www.antlr.org. Strumento automatico che permette di generare parser ricorsivi discendenti usando LL(*) (un estensione dellLL(k) che usa."

Presentazioni simili


Annunci Google