A parser for PostgreSQL written in Pharo using PetitParser.
For now, the focus is made on PL/pgSQL source code.
Metacello new
baseline: 'PostgreSQLParser';
repository: 'github://juliendelplanque/PostgreSQLParser/src';
load
You can use the groups defined in the baseline to install only what you need. The following groups are available:
parser
: Only the tokenizer and the grammar.parser-tests
:parser
and its unit tests.ast
: Only the Abstract Syntactic Tree model.ast-builder
:ast
+ the object that builds the AST from the source code (also requiresparser
).ast-builder-tests
:ast-builder
+ its unit tests.visitors
:ast
+ default visitors of the AST.core
:parser
+ast
+ast-builder
.core-tests
:core
+ all unit tests associated.future
: Experimental code of this project, do not use this in production.dev
: Everything you need to help in this project development loadsfuture
group as well.
Let's say you only need the ast
group, the following code will load this specific group:
Metacello new
baseline: 'PostgreSQLParser';
repository: 'github://juliendelplanque/PostgreSQLParser/src';
load: 'ast'
To use this project as a dependency, add the following code in your baseline:
[...]
spec baseline: 'PostgreSQLParser' with: [
spec
repository: 'github://juliendelplanque/PostgreSQLParser/src' ]
[...]
The complexity of the parsing process is hidden (for users) behind a facade: PostgreSQLParser
class. The class-side methods provide a simple API to parse SQL code and get an AST as return.
For example:
ast := PostgreSQLParser parseSelectQuery: 'SELECT person.id, person.name, person.city_id
FROM person, city
WHERE person.city_id = city.id
LIMIT 10'. "Mind that there is not trailing ';' because this is part of statement's grammar not query grammar."
"... process the AST... "
There other methods work similarly:
PostgreSQLParser class>>#parseUpdateQuery:
PostgreSQLParser class>>#parseCRUDQuery:
PostgreSQLParser class>>#parseDeleteQuery:
PostgreSQLParser class>>#parseInsertQuery:
PostgreSQLParser class>>#parseSelectQuery:
PostgreSQLParser class>>#parseStoredProcedureBody: