WikiUp

LPG e compilazione script

Presentazione di LPG e suo utilizzo

Per lo sviluppo del parser SQL di As.UP è stata utilizzata come base di partenza il parser SQL presente nel progetto DTP (Datatool project) di Eclipse. Questo pacchetto contiene tra le altre cose l'implementazione di un parser SQL capace di interpretare gli statements SQL di tipo DML (Data Manager Language), cioè le query dedicate alla gestione di tabelle SQL e oggeti derivati. Questo parser non gestisce invece statement di tipo DCL (Data Creation Language) e quindi non è in grado di gestire statement SQL dedicati alla creazione di oggetti di database. Il parser SQL presente nel datatool supporta un SQL di tipo esteso basato su sintassi DB2, con buona copertura anche di statement non standard specifici di questa implementazione (con il limite del supporto solo DML).

Il parser SQL del DTP è implementato su LPG (Lexer Parser Generator), un tool dedicato alla generazione di parser a partire da script di grammatica scritti basati su regole BNF.

  1. Scrivere regole BNF che definiscono il Lexer. E' il componente che esegue l'analisi lessicale di una stringa, individuando le parole e strutture chiave.
  2. Scrivere le regole del parser. Il parser è il componente che partendo dai token individuati dal lexer individua la struttura grammaticale di una stringa
  3. Generare la struttura della stringa come albero sintattico (AST)

Senza scendere in dettagli, LPG applica una politica di parsing di tipo LR ( o bottom-up) dove l'analizzatore tratta per prime le strutture elementari identificate dal lexer (i token) per poi procedere a ritroso per valutare le strutture che le contengono.

Il tool LPG opera partendo da file di grammatica in formato *.lpg (non obbligatorio, ma consigliato). Il file di grammatica può contenere sia la parte di lexer che quella di parsing oppure le due parti possono essere separate in due o più file. E' inoltre possibile l'include di file (trattato come vera e propria inclusione di un file in un altro) e quindi lo spezzettamento della grammatica in più sorgenti.

  1. Nel bundle org.eclipse.datatools.sqltools.parser.sql.lexer sono state inserite tutte le regole del lexer
  2. Nel bundle org.eclipse.datatools.sqltools.parser.sql.parser sono state inserite tutte le regole del parser SQL
  3. Nel bundle org.eclipse.datatools.sqltools.parser.sql sono state inserite tutti i template base del parser (definizioni di costanti, alias ecc ecc)
  4. Non viene utilizzato l'albero sintattico AST prodotto da LPG ma viene costruito un albero sintattico basato sul modello EMF di un database
previsto dal DTP (definito nei plugins org.eclipse.datatools.modelbase.*)
  1. La costruzione dell'albero sintattico EMF viene effettuata includendo nelle regole del parser delle chiamate ad una specifica classe di
utility che mappa i token e le strutture sintattiche individuate dal parser LPG in oggetti EMF del modello datatools (classe SQLQueryParserFactory)

Parser SQL di As.UP.

Gli script LPG per la generazione del parser SQL sono contenuti all'interno del bundle:

org.asup.datatools.sqltools.parsers.sql.query.iseries

da questo punto in avanti indicato per brevità come BUNDLE

Gli script LPG del DTP sono strutturati mediante una combinazione di files multipli e inclusioni. Per questo motivo, nel pacchetto BUNDLE sono stati raggruppati per comodità tutte i file script del pacchetto DTP utilizzati come base di inclusione per lo sviluppo del parser SQl Asup.

  1. Cartella BUNDLE/lpg_include/lexer: contiene tutti i file di inclusione relativi al lexer DTP standard (derivati da org.eclipse.datatools.sqltools.parser.sql.lexer)
  2. Cartella BUNDLE/lpg_include/query: contiene tutti i file di inclusione relativi al parser DTP standard (derivati da org.eclipse.datatools.sqltools.parser.sql.query)
  3. Cartella BUNDLE/lpg_include/sql: contiene tutti i file di inclusione relativi all'ambiente base DTP (derivati da org.eclipse.datatools.sqltools.parser.sql)

Per l'implementazione del nuovo parser si è deciso di operare come estensione del parser SQL presente nel DTP. LPG non consente esplicitamente una ereditarietaà sulle regole. Quando si definiscono nello stesso script due regole con lo stesso nome, in fase di elaborazione l'ultima definizione trovata va a sostituire le precedenti con lo stesso nome. Questo comportamento, unitamente al meccanismo degli include, ha quindi permesso di simulare un override delle regole e fare in modo che lo scritp del parser SQL Asup potesse modificare regole preesistenti nello script padre.

  1. sqliSeriesQueryParser.lpg: script di partenza, che si occupa di effettuare tutti gli include necessari. E' lo script che andrà compilato per la generazione del parser.
  2. sqliSeriesQueryParserRules.lpg: script che definisce le nuove regole del parser SQL Asup e l'override di regole del DTP che vanno modificate

Nella cartella BUNDLE/docs del progetto sono stati raccolti i (pochi) manuali che spiegano la sintassi LPG e l'utilizzo del prodotto.

Compilazione di uno script LPG

LPG è disponibile come tool esterno, non esiste un plugin che integri le funzionalità all'interno di Eclipse.

Questo tool deve quindi essere installato sul sistema di sviluppo e invocato attraverso uno script di sistema o come invocazione di tool esterno di Eclipse.

Installazione del tool LPG

Per la compilazione degli script del parser QL di As.UP è necessaria la versione 1.0 del tool LPG, scaricabile all'indirizzo:

http://sourceforge.net/projects/lpg/files/lpg-v1/LPG-V1.0/

Il pacchetto scaricato contiene tutto il necessario e va installato sul sistema semplicemente scompattando il contenuto della libreria in una cartella.

Creazione del link al motore LPG in Eclipse

Non esistendo un plugin LPG per Eclipse, l'invocazione del tool di generazione del codice java a partire dallo script lpg può avvenire solo attraverso l'invocazione di un tool esterno.

  1. Selezionare la funzione "External tool configuration", accessibile da menù disponibile sull'icona "External tools" della toolbar di Eclipse.
  2. Creare una nuova configurazione di tipo "Program" e denominarla "LPG"
  3. Nel campo "Location" inserire il link all'eseguibile LPG

c:\Programmi\LPG\lpgexe\lpg.exe

ovviamente il path corretto dipende dalla directory in cui si è installato il tool LPG sul sistema
  1. Nel campo "Working directory" inserire la stringa "${container_loc}"
  2. Nel campo "Arguments" inserire i riferimenti alle drectory di include

    1. _-include-directory='.;..;C:\EclipseWorkspaces\JavaAsupProject_0_2\org.asup.datatools.sqltools.parsers.sql.query.iseries\lpg_include\lexer;
C:\EclipseWorkspaces\JavaAsupProject_0_2\org.asup.datatools.sqltools.parsers.sql.query.iseries\lpg_include\query;
C:\EclipseWorkspaces\JavaAsupProject_0_2\org.asup.datatools.sqltools.parsers.sql.query.iseries\lpg_include\sql' ${resource_loc}
_n_

Compilazione dello script LPG

Per compilare uno script LPG selezionare il file nel package explorer di Eclipse e selezionare dall'icona "External tools" di Eclipse la configurazione creata al punto precedente.

  1. Le classi del parser e le classi di utility. Il package che contiene le classi generate è definito come attributo nello script lpg.
  2. I file di log (con estensione *.l) con il tracing di tutte le operazioni fatte in fase di generazione

In seguito viene riportata una ulteriore possibilità di installazione e utilizzo del tool LPG sotto Eclipse che passa attraverso le funzionalità del progetto IMP (IDE Meta-Tooling Platform progetto non uscito dalla fase di incubazione)

Running LPG as an External Tool with IMP (alternative method from IMP manual)

Installing LPG with IMP upgrade site

Add the IMP upgrade site to the Eclipse upgrade sites list:

http://download.eclipse.org/technology/imp/updates/

Open the IMP upgrade site and install only the packages relative to LPG functionality

Invoke LPG

LPG can be run manually in Eclipse as an external tool. To be able to do this, you must have the plugin project lpg.generator and the appropriate platform-specific plugin fragment (e.g., lpg.generator.macosx86) imported into your workspace. These projects contain the LPG executable and the platform-independent template/include files, as well as the Eclipse launch configuration (in the folder ".launchConfigurations). When this project is in your workspace, the launch configuration should be recognized automatically and should be available through the External Tools menu. (To open the External Tools dialog, navigate "Run" -> "External Tools" -> "External Tools ..."; you should then find LPG under "Programs")

You can also run LPG manually as an external tool on a grammar specification file (".g" or ".gi" file). To do so, select the grammar file and then invoke LPG from the External Tools dialog. If you run LPG on a ".g" file, LPG will generate a complete set of tools (parsre, lexer, and keyword filter). If you run LPG on a ".gi" file, you can generate just the lexer or keyword filter (depending on the specific file).

The default parameters of the launch configuration for use with IMP are as follows:

Location: This is the location of the LPG executable:

${workspace_loc}/lpg.generator.${target.os}_${target.arch}/lpgexe/lpg-${target.os}_${target.arch}

Note that this will use the executable located in the appropriate platform-specific plugin fragment.

Working directory: This is the location in which the input source will be found and the output specifications generated. It is set relative to the selected grammar file.

${container_loc}

Arguments: This tells LPG where to find the templates to use in generating the parser, lexer, and keyword filter:

-include-directory='.;..;C:\EclipseWorkspaces\JavaAsupProject_0_2\org.asup.datatools.sqltools.parsers.sql.query.iseries\lpg_include\lexer; C:\EclipseWorkspaces\JavaAsupProject_0_2\org.asup.datatools.sqltools.parsers.sql.query.iseries\lpg_include\query; C:\EclipseWorkspaces\JavaAsupProject_0_2\org.asup.datatools.sqltools.parsers.sql.query.iseries\lpg_include\sql' ${resource_loc}

Add new attachment

Only authorized users are allowed to upload new attachments.
«