%%(display:none)
{{{
WikiUp
}}}
/%
[{TableOfContents }]\\
!!! 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.

# Scrivere regole BNF che definiscono il Lexer. E' il componente che esegue l'analisi lessicale di una stringa, individuando le parole e strutture chiave.\\
# Scrivere le regole del parser. Il parser è il componente che partendo dai token individuati dal lexer individua la struttura grammaticale di una stringa\\
# 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.

# Nel bundle __org.eclipse.datatools.sqltools.parser.sql.lexer__ sono state inserite tutte le regole del lexer\\
# Nel bundle __org.eclipse.datatools.sqltools.parser.sql.parser__ sono state inserite tutte le regole del parser SQL\\
# Nel bundle __org.eclipse.datatools.sqltools.parser.sql__ sono state inserite tutti i template base del parser (definizioni di costanti, alias ecc ecc)\\
# 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.*)\\
# 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.

# 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)\\
# 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)\\
# 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.

# __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.\\
# __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.

# Selezionare la funzione __"External tool configuration"__, accessibile da menù disponibile sull'icona __"External tools"__ della toolbar di Eclipse.\\
# Creare una nuova configurazione di tipo __"Program"__ e denominarla __"LPG"__\\
# 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\\
# Nel campo __"Working directory"__ inserire la stringa __"${container_loc}"__\\
# Nel  campo __"Arguments"__ inserire i riferimenti alle drectory di include\\
\\
##_-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.

# Le classi del parser e le classi di utility. Il package che contiene le classi generate è definito come attributo nello script lpg.\\
# 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}