| 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} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|