At line 1 added 178 lines |
%%(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} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|