com.googlecode.sparkleg.IdentVisitor.java Source code

Java tutorial

Introduction

Here is the source code for com.googlecode.sparkleg.IdentVisitor.java

Source

/*
 *    Copyright 2007-2013 The sparkle-g Team
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
/**
 * @author Simone Tripodi (simone.tripodi)
 * @author Michele Mostarda (michele.mostarda)
 * @author Juergen Pfundt (Juergen.Pfundt)
 * @version $Id: Sparql.g 523 2012-02-17 23:10:57Z Juergen.Pfundt@gmail.com $
 */
package com.googlecode.sparkleg;

import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.TerminalNode;

import org.stringtemplate.v4.*;

public class IdentVisitor extends SparqlParserBaseVisitor<ST> implements SparqlParserVisitor<ST> {

    STGroup g = null;

    public void setSTGroup(STGroup g) {
        this.g = g;
    }

    @Override
    public ST visitQuery(SparqlParser.QueryContext ctx) {
        // query :
        //   prologue (selectQuery | constructQuery | describeQuery | askQuery) bindingsClause EOF
        // | update (SEMICOLON update?)* SEMICOLON? EOF

        ST query = g.getInstanceOf("query");

        if (ctx.prologue() != null) {
            query.add("prologue", visitPrologue(ctx.prologue()));

            if (ctx.selectQuery() != null) {
                query.add("selectQuery", visitSelectQuery(ctx.selectQuery()));
            } else if (ctx.constructQuery() != null) {
                query.add("constructQuery", visitConstructQuery(ctx.constructQuery()));
            } else if (ctx.describeQuery() != null) {
                query.add("describeQuery", visitDescribeQuery(ctx.describeQuery()));
            } else if (ctx.askQuery() != null) {
                query.add("askQuery", visitAskQuery(ctx.askQuery()));
            }

            query.add("valuesClause", visitValuesClause(ctx.valuesClause()));
        } else {
            query.add("updateCommand", visitUpdateCommand(ctx.updateCommand()));
        }

        return query;
    }

    @Override
    public ST visitPrologue(SparqlParser.PrologueContext ctx) {
        // prologue :
        //   (baseDecl | prefixDecl)*

        ST prologue = g.getInstanceOf("prologue");

        if (ctx.children != null) {
            for (ParseTree c : ctx.children) {
                if (c instanceof SparqlParser.BaseDeclContext) {
                    prologue.add("declaration", visitBaseDecl((SparqlParser.BaseDeclContext) c));
                } else if (c instanceof SparqlParser.PrefixDeclContext) {
                    prologue.add("declaration", visitPrefixDecl((SparqlParser.PrefixDeclContext) c));
                }
            }
        }

        return prologue;
    }

    @Override
    public ST visitBaseDecl(SparqlParser.BaseDeclContext ctx) {
        // baseDecl :
        //   BASE IRIREF

        ST baseDecl = g.getInstanceOf("baseDecl");

        String s = ctx.IRIREF().getSymbol().getText();
        baseDecl.add("iriref", s.substring(1, s.length() - 1));

        return baseDecl;
    }

    @Override
    public ST visitPrefixDecl(SparqlParser.PrefixDeclContext ctx) {
        // prefixDecl :
        //   PREFIX PNAME_NS IRIREF

        ST prefixDecl = g.getInstanceOf("prefixDecl");

        prefixDecl.add("pname", ctx.PNAME_NS().getSymbol().getText());

        String s = ctx.IRIREF().getSymbol().getText();
        prefixDecl.add("iriref", s.substring(1, s.length() - 1));

        return prefixDecl;
    }

    @Override
    public ST visitSelectQuery(SparqlParser.SelectQueryContext ctx) {
        // selectQuery :
        //   selectClause datasetClause* whereClause solutionModifier

        ST selectQuery = g.getInstanceOf("selectQuery");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.SelectClauseContext) {
                selectQuery.add("selectClause", visitSelectClause((SparqlParser.SelectClauseContext) c));
            } else if (c instanceof SparqlParser.DatasetClauseContext) {
                selectQuery.add("datasetClause", visitDatasetClause((SparqlParser.DatasetClauseContext) c));
            } else if (c instanceof SparqlParser.WhereClauseContext) {
                selectQuery.add("whereClause", visitWhereClause((SparqlParser.WhereClauseContext) c));
            } else if (c instanceof SparqlParser.SolutionModifierContext) {
                selectQuery.add("solutionModifier",
                        visitSolutionModifier((SparqlParser.SolutionModifierContext) c));
            }
        }

        return selectQuery;
    }

    @Override
    public ST visitSubSelect(SparqlParser.SubSelectContext ctx) {
        // subSelect
        //   selectClause whereClause solutionModifier valuesClause

        ST subSelect = g.getInstanceOf("subSelect");

        subSelect.add("selectClause", visitSelectClause(ctx.selectClause()));
        subSelect.add("whereClause", visitWhereClause(ctx.whereClause()));
        subSelect.add("solutionModifier", visitSolutionModifier(ctx.solutionModifier()));
        subSelect.add("valuesClause", visitValuesClause(ctx.valuesClause()));

        return subSelect;
    }

    /**
     *
     * @param ctx
     * @return ST
     */
    @Override
    public ST visitSelectClause(SparqlParser.SelectClauseContext ctx) {
        // selectClause :
        //   SELECT (DISTINCT | REDUCED)? (selectVariables+ | ASTERISK)

        ST selectClause = g.getInstanceOf("selectClause");

        for (ParseTree c : ctx.children) {
            if (c instanceof TerminalNode) {
                TerminalNode t = (TerminalNode) c;
                Token to = (Token) (t.getSymbol());
                if (to.getType() == SparqlParser.ASTERISK) {
                    selectClause.add("ASTERISK", to.getText());
                } else if (to.getType() == SparqlParser.DISTINCT) {
                    selectClause.add("attribute", to.getText().toUpperCase());
                } else if (to.getType() == SparqlParser.REDUCED) {
                    selectClause.add("attribute", to.getText().toUpperCase());
                }
            } else if (c instanceof SparqlParser.SelectVariablesContext) {
                selectClause.add("selectVariables", visitSelectVariables((SparqlParser.SelectVariablesContext) c));
            }
        }

        return selectClause;
    }

    @Override
    public ST visitSelectVariables(SparqlParser.SelectVariablesContext ctx) {
        // selectVariables :
        //  var | OPEN_BRACE expression AS var CLOSE_BRACE

        ST selectVariables = g.getInstanceOf("selectVariables");

        if (ctx.expression() != null) {
            selectVariables.add("expression", visit(ctx.expression()));
        }
        if (ctx.var() != null) {
            selectVariables.add("var", visitVar(ctx.var()));
        }

        return selectVariables;
    }

    @Override
    public ST visitConstructQuery(SparqlParser.ConstructQueryContext ctx) {
        // constructQuery
        //   CONSTRUCT (constructTemplate datasetClause* whereClause solutionModifier | datasetClause* WHERE OPEN_CURLY_BRACE triplesTemplate? CLOSE_CURLY_BRACE solutionModifier)

        ST constructQuery = g.getInstanceOf("constructQuery");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.ConstructTemplateContext) {
                constructQuery.add("constructTemplate",
                        visitConstructTemplate((SparqlParser.ConstructTemplateContext) c));
            } else if (c instanceof SparqlParser.DatasetClauseContext) {
                constructQuery.add("datasetClause", visitDatasetClause((SparqlParser.DatasetClauseContext) c));
            } else if (c instanceof SparqlParser.WhereClauseContext) {
                constructQuery.add("whereClause", visitWhereClause((SparqlParser.WhereClauseContext) c));
            } else if (c instanceof SparqlParser.TriplesTemplateContext) {
                constructQuery.add("triplesTemplate",
                        visitTriplesTemplate((SparqlParser.TriplesTemplateContext) c));
            } else if (c instanceof SparqlParser.SolutionModifierContext) {
                constructQuery.add("solutionModifier",
                        visitSolutionModifier((SparqlParser.SolutionModifierContext) c));
            }
        }

        return constructQuery;
    }

    @Override
    public ST visitDescribeQuery(SparqlParser.DescribeQueryContext ctx) {
        // describeQuery
        //   DESCRIBE (varOrIRI+ | ASTERISK) datasetClause* whereClause? solutionModifier

        ST describeQuery = g.getInstanceOf("describeQuery");

        for (ParseTree c : ctx.children) {
            if (c instanceof TerminalNode) {
                TerminalNode t = (TerminalNode) c;
                Token to = (Token) (t.getSymbol());
                if (to.getType() == SparqlParser.ASTERISK) {
                    describeQuery.add("ASTERISK", to.getText());
                }
            } else if (c instanceof SparqlParser.VarOrIRIContext) {
                describeQuery.add("varOrIRI", visitVarOrIRI((SparqlParser.VarOrIRIContext) c));
            } else if (c instanceof SparqlParser.DatasetClauseContext) {
                describeQuery.add("datasetClause", visitDatasetClause((SparqlParser.DatasetClauseContext) c));
            } else if (c instanceof SparqlParser.WhereClauseContext) {
                describeQuery.add("whereClause", visitWhereClause((SparqlParser.WhereClauseContext) c));
            } else if (c instanceof SparqlParser.SolutionModifierContext) {
                describeQuery.add("solutionModifier",
                        visitSolutionModifier((SparqlParser.SolutionModifierContext) c));
            }
        }

        return describeQuery;
    }

    @Override
    public ST visitAskQuery(SparqlParser.AskQueryContext ctx) {
        // askQuery
        //   ASK datasetClause* whereClause solutionModifier

        ST askQuery = g.getInstanceOf("askQuery");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.DatasetClauseContext) {
                askQuery.add("datasetClause", visitDatasetClause((SparqlParser.DatasetClauseContext) c));
            } else if (c instanceof SparqlParser.WhereClauseContext) {
                askQuery.add("whereClause", visitWhereClause((SparqlParser.WhereClauseContext) c));
            } else if (c instanceof SparqlParser.SolutionModifierContext) {
                askQuery.add("solutionModifier", visitSolutionModifier((SparqlParser.SolutionModifierContext) c));
            }
        }

        return askQuery;
    }

    @Override
    public ST visitDatasetClause(SparqlParser.DatasetClauseContext ctx) {
        // datasetClause
        //   FROM NAMED? iri

        ST datasetClause = g.getInstanceOf("datasetClause");

        if (ctx.NAMED() != null) {
            datasetClause.add("NAMED", ctx.NAMED().getSymbol().getText().toUpperCase());
        }

        datasetClause.add("iri", visitIri(ctx.iri()));

        return datasetClause;
    }

    @Override
    public ST visitWhereClause(SparqlParser.WhereClauseContext ctx) {
        // whereClause :
        //   WHERE? groupGraphPattern

        ST whereClause = g.getInstanceOf("whereClause");

        whereClause.add("groupGraphPattern", visitGroupGraphPattern(ctx.groupGraphPattern()));

        return whereClause;
    }

    @Override
    public ST visitSolutionModifier(SparqlParser.SolutionModifierContext ctx) {
        // solutionModifier :
        //   groupClause? havingClause? orderClause? limitOffsetClauses?

        ST solutionModifier = g.getInstanceOf("solutionModifier");

        if (ctx.groupClause() != null) {
            solutionModifier.add("groupClause", visitGroupClause(ctx.groupClause()));
        }

        if (ctx.havingClause() != null) {
            solutionModifier.add("havingClause", visitHavingClause(ctx.havingClause()));
        }

        if (ctx.orderClause() != null) {
            solutionModifier.add("orderClause", visitOrderClause(ctx.orderClause()));
        }

        if (ctx.limitOffsetClauses() != null) {
            solutionModifier.add("limitOffsetClauses", visitLimitOffsetClauses(ctx.limitOffsetClauses()));
        }

        return solutionModifier;
    }

    @Override
    public ST visitGroupClause(SparqlParser.GroupClauseContext ctx) {
        // groupClause
        //   GROUP BY groupCondition+

        ST groupClause = g.getInstanceOf("groupClause");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.GroupConditionContext) {
                groupClause.add("groupCondition", visitGroupCondition((SparqlParser.GroupConditionContext) c));
            }
        }

        return groupClause;
    }

    @Override
    public ST visitGroupCondition(SparqlParser.GroupConditionContext ctx) {
        // groupCondition
        //   builtInCall | functionCall | OPEN_BRACE expression (AS var)? CLOSE_BRACE | var

        ST groupCondition = g.getInstanceOf("groupCondition");

        if (ctx.builtInCall() != null) {
            groupCondition.add("builtInCall", visitBuiltInCall(ctx.builtInCall()));
        } else if (ctx.functionCall() != null) {
            groupCondition.add("functionCall", visitFunctionCall(ctx.functionCall()));
        } else if (ctx.expression() != null) {
            groupCondition.add("expression", visit(ctx.expression()));
            if (ctx.var() != null) {
                groupCondition.add("var", visitVar(ctx.var()));
            }
        } else if (ctx.var() != null) {
            groupCondition.add("var", visitVar(ctx.var()));
        }

        return groupCondition;
    }

    @Override
    public ST visitHavingClause(SparqlParser.HavingClauseContext ctx) {
        // havingClause
        //   HAVING havingCondition+

        ST havingClause = g.getInstanceOf("havingClause");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.HavingConditionContext) {
                havingClause.add("havingCondition", visitHavingCondition((SparqlParser.HavingConditionContext) c));
            }
        }

        return havingClause;
    }

    @Override
    public ST visitHavingCondition(SparqlParser.HavingConditionContext ctx) {
        // havingCondition
        //   constraint

        ST havingCondition = g.getInstanceOf("havingCondition");

        havingCondition.add("constraint", visitConstraint(ctx.constraint()));

        return havingCondition;
    }

    @Override
    public ST visitOrderClause(SparqlParser.OrderClauseContext ctx) {
        // orderClause
        //   ORDER BY orderCondition+

        ST orderClause = g.getInstanceOf("orderClause");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.OrderConditionContext) {
                orderClause.add("orderCondition", visitOrderCondition((SparqlParser.OrderConditionContext) c));
            }
        }

        return orderClause;
    }

    @Override
    public ST visitOrderCondition(SparqlParser.OrderConditionContext ctx) {
        // orderCondition
        //   (ASC|DESC) OPEN_BRACE expression CLOSE_BRACE | constraint | var

        ST orderCondition = g.getInstanceOf("orderCondition");

        if (ctx.ASC() != null) {
            orderCondition.add("ASC", ctx.ASC().getSymbol().getText().toUpperCase());
            orderCondition.add("expression", visit(ctx.expression()));
        } else if (ctx.DESC() != null) {
            orderCondition.add("DESC", ctx.DESC().getSymbol().getText().toUpperCase());
            orderCondition.add("expression", visit(ctx.expression()));
        } else if (ctx.constraint() != null) {
            orderCondition.add("constraint", visitConstraint(ctx.constraint()));
        } else if (ctx.var() != null) {
            orderCondition.add("var", visitVar(ctx.var()));
        }

        return orderCondition;
    }

    @Override
    public ST visitLimitOffsetClauses(SparqlParser.LimitOffsetClausesContext ctx) {
        // limitOffsetClauses
        //   limitClause offsetClause? | offsetClause limitClause?

        ST limitOffsetClauses = g.getInstanceOf("limitOffsetClauses");

        if (ctx.limitClause() != null) {
            limitOffsetClauses.add("limitClause", visitLimitClause(ctx.limitClause()));
        }

        if (ctx.offsetClause() != null) {
            limitOffsetClauses.add("offsetClause", visitOffsetClause(ctx.offsetClause()));
        }

        return limitOffsetClauses;
    }

    @Override
    public ST visitLimitClause(SparqlParser.LimitClauseContext ctx) {
        // limitClause
        //   LIMIT INTEGER

        ST limitClause = g.getInstanceOf("limitClause");

        limitClause.add("limit", ctx.INTEGER().getSymbol().getText());

        return limitClause;
    }

    @Override
    public ST visitOffsetClause(SparqlParser.OffsetClauseContext ctx) {
        // offsetClause
        //   OFFSET INTEGER

        ST offsetClause = g.getInstanceOf("offsetClause");

        offsetClause.add("offset", ctx.INTEGER().getSymbol().getText());

        return offsetClause;
    }

    @Override
    public ST visitValuesClause(SparqlParser.ValuesClauseContext ctx) {
        // valuesClause :
        //  (VALUES dataBlock)?

        ST valuesClause = g.getInstanceOf("valuesClause");

        if (ctx.dataBlock() != null) {
            valuesClause.add("dataBlock", visitDataBlock(ctx.dataBlock()));
        }

        return valuesClause;
    }

    @Override
    public ST visitUpdateCommand(SparqlParser.UpdateCommandContext ctx) {
        // updateCommand :
        //  prologue (update (';' prologue update)* (';' prologue)?)?

        ST updateCommand = g.getInstanceOf("updateCommand");

        if (ctx != null) {
            for (ParseTree c : ctx.children) {
                if (c instanceof SparqlParser.PrologueContext) {
                    updateCommand.add("prologue", visitPrologue((SparqlParser.PrologueContext) c));
                } else if (c instanceof SparqlParser.UpdateContext) {
                    updateCommand.add("update", visitUpdate((SparqlParser.UpdateContext) c));
                }
            }
        }

        return updateCommand;
    }

    @Override
    public ST visitUpdate(SparqlParser.UpdateContext ctx) {
        // update :
        //   load | clear | drop | add | move | copy | create | insertData | deleteData | deleteWhere | modify

        ST update = g.getInstanceOf("update");

        if (ctx.load() != null) {
            update.add("load", visitLoad(ctx.load()));
        } else if (ctx.clear() != null) {
            update.add("clear", visitClear(ctx.clear()));
        } else if (ctx.drop() != null) {
            update.add("drop", visitDrop(ctx.drop()));
        } else if (ctx.add() != null) {
            update.add("add", visitAdd(ctx.add()));
        } else if (ctx.move() != null) {
            update.add("move", visitMove(ctx.move()));
        } else if (ctx.copy() != null) {
            update.add("copy", visitCopy(ctx.copy()));
        } else if (ctx.create() != null) {
            update.add("create", visitCreate(ctx.create()));
        } else if (ctx.insertData() != null) {
            update.add("insertData", visitInsertData(ctx.insertData()));
        } else if (ctx.deleteData() != null) {
            update.add("deleteData", visitDeleteData(ctx.deleteData()));
        } else if (ctx.deleteWhere() != null) {
            update.add("deleteWhere", visitDeleteWhere(ctx.deleteWhere()));
        } else if (ctx.modify() != null) {
            update.add("modify", visitModify(ctx.modify()));
        }

        return update;
    }

    @Override
    public ST visitLoad(SparqlParser.LoadContext ctx) {
        // load :     
        //   LOAD SILENT? iri (INTO graphRef)?

        ST load = g.getInstanceOf("load");

        if (ctx.SILENT() != null) {
            load.add("SILENT", ctx.SILENT().getSymbol().getText().toUpperCase());
        }

        load.add("iri", visitIri(ctx.iri()));

        if (ctx.graphRef() != null) {
            load.add("graphRef", visitGraphRef(ctx.graphRef()));
        }

        return load;
    }

    @Override
    public ST visitClear(SparqlParser.ClearContext ctx) {
        // clear :
        //   CLEAR  SILENT? graphRefAll

        ST clear = g.getInstanceOf("clear");

        if (ctx.SILENT() != null) {
            clear.add("SILENT", ctx.SILENT().getSymbol().getText().toUpperCase());
        }

        clear.add("graphRefAll", visitGraphRefAll(ctx.graphRefAll()));

        return clear;
    }

    @Override
    public ST visitDrop(SparqlParser.DropContext ctx) {
        // drop :
        //   DROP SILENT? graphRefAll

        ST drop = g.getInstanceOf("drop");

        if (ctx.SILENT() != null) {
            drop.add("SILENT", ctx.SILENT().getSymbol().getText().toUpperCase());
        }

        drop.add("graphRefAll", visitGraphRefAll(ctx.graphRefAll()));

        return drop;
    }

    @Override
    public ST visitCreate(SparqlParser.CreateContext ctx) {
        // create :
        //   CREATE SILENT? graphRef

        ST create = g.getInstanceOf("create");

        if (ctx.SILENT() != null) {
            create.add("SILENT", ctx.SILENT().getSymbol().getText().toUpperCase());
        }

        create.add("graphRef", visitGraphRef(ctx.graphRef()));

        return create;
    }

    @Override
    public ST visitAdd(SparqlParser.AddContext ctx) {
        // add :
        //   ADD SILENT? graphOrDefault TO graphOrDefault

        ST add = g.getInstanceOf("add");

        if (ctx.SILENT() != null) {
            add.add("SILENT", ctx.SILENT().getSymbol().getText().toUpperCase());
        }

        add.add("graphOrDefault1", visitGraphOrDefault(ctx.graphOrDefault(0)));
        add.add("graphOrDefault2", visitGraphOrDefault(ctx.graphOrDefault(1)));

        return add;
    }

    @Override
    public ST visitMove(SparqlParser.MoveContext ctx) {
        // move :
        //   MOVE SILENT? graphOrDefault TO graphOrDefault

        ST move = g.getInstanceOf("move");

        if (ctx.SILENT() != null) {
            move.add("SILENT", ctx.SILENT().getSymbol().getText().toUpperCase());
        }

        move.add("graphOrDefault1", visitGraphOrDefault(ctx.graphOrDefault(0)));
        move.add("graphOrDefault2", visitGraphOrDefault(ctx.graphOrDefault(1)));

        return move;
    }

    @Override
    public ST visitCopy(SparqlParser.CopyContext ctx) {
        // copy :
        //   COPY SILENT? graphOrDefault TO graphOrDefault

        ST copy = g.getInstanceOf("copy");

        if (ctx.SILENT() != null) {
            copy.add("SILENT", ctx.SILENT().getSymbol().getText().toUpperCase());
        }

        copy.add("graphOrDefault1", visitGraphOrDefault(ctx.graphOrDefault(0)));
        copy.add("graphOrDefault2", visitGraphOrDefault(ctx.graphOrDefault(1)));

        return copy;
    }

    @Override
    public ST visitInsertData(SparqlParser.InsertDataContext ctx) {
        // insertData :
        //   INSERT DATA quadData

        ST insertData = g.getInstanceOf("insertData");

        insertData.add("quadData", visitQuadData(ctx.quadData()));

        return insertData;
    }

    @Override
    public ST visitDeleteData(SparqlParser.DeleteDataContext ctx) {
        // deleteData :
        //   DELETE DATA quadData

        ST deleteData = g.getInstanceOf("deleteData");

        deleteData.add("quadData", visitQuadData(ctx.quadData()));

        return deleteData;
    }

    @Override
    public ST visitDeleteWhere(SparqlParser.DeleteWhereContext ctx) {
        // deleteWhere :
        //   DELETE WHERE quadPattern

        ST deleteWhere = g.getInstanceOf("deleteWhere");

        deleteWhere.add("quadPattern", visitQuadPattern(ctx.quadPattern()));

        return deleteWhere;
    }

    @Override
    public ST visitModify(SparqlParser.ModifyContext ctx) {
        // modify :
        //   (WITH iri)? (deleteClause insertClause? | insertClause) usingClause* WHERE groupGraphPattern

        ST modify = g.getInstanceOf("modify");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.IriContext) {
                modify.add("iri", visitIri((SparqlParser.IriContext) c));
            } else if (c instanceof SparqlParser.DeleteClauseContext) {
                modify.add("deleteClause", visitDeleteClause((SparqlParser.DeleteClauseContext) c));
            } else if (c instanceof SparqlParser.InsertClauseContext) {
                modify.add("insertClause", visitInsertClause((SparqlParser.InsertClauseContext) c));
            } else if (c instanceof SparqlParser.UsingClauseContext) {
                modify.add("usingClause", visitUsingClause((SparqlParser.UsingClauseContext) c));
            } else if (c instanceof SparqlParser.GroupGraphPatternContext) {
                modify.add("groupGraphPattern", visitGroupGraphPattern((SparqlParser.GroupGraphPatternContext) c));
            }
        }

        return modify;
    }

    @Override
    public ST visitDeleteClause(SparqlParser.DeleteClauseContext ctx) {
        // deleteClause :
        //   DELETE quadPattern

        ST deleteClause = g.getInstanceOf("deleteClause");

        deleteClause.add("quadPattern", visitQuadPattern(ctx.quadPattern()));

        return deleteClause;
    }

    @Override
    public ST visitInsertClause(SparqlParser.InsertClauseContext ctx) {
        // insertClause :
        //   INSERT quadPattern

        ST insertClause = g.getInstanceOf("insertClause");

        insertClause.add("quadPattern", visitQuadPattern(ctx.quadPattern()));

        return insertClause;
    }

    @Override
    public ST visitUsingClause(SparqlParser.UsingClauseContext ctx) {
        // usingClause :
        //   USING NAMED? iri

        ST usingClause = g.getInstanceOf("usingClause");

        if (ctx.NAMED() != null) {
            usingClause.add("NAMED", ctx.NAMED().getSymbol().getText().toUpperCase());
        }

        usingClause.add("iri", visitIri(ctx.iri()));

        return usingClause;
    }

    @Override
    public ST visitGraphOrDefault(SparqlParser.GraphOrDefaultContext ctx) {
        // graphOrDefault :     
        //   DEFAULT | GRAPH? iri

        ST graphOrDefault = g.getInstanceOf("graphOrDefault");

        if (ctx.DEFAULT() != null) {
            graphOrDefault.add("DEFAULT", ctx.DEFAULT().getSymbol().getText().toUpperCase());
        } else {
            if (ctx.GRAPH() != null) {
                graphOrDefault.add("GRAPH", ctx.GRAPH().getSymbol().getText().toUpperCase());
            }
            graphOrDefault.add("iri", visitIri(ctx.iri()));
        }

        return graphOrDefault;
    }

    @Override
    public ST visitGraphRef(SparqlParser.GraphRefContext ctx) {
        // graphRef :     
        //   GRAPH iri

        ST graphRef = g.getInstanceOf("graphRef");

        graphRef.add("iri", visitIri(ctx.iri()));

        return graphRef;
    }

    @Override
    public ST visitGraphRefAll(SparqlParser.GraphRefAllContext ctx) {
        // graphRefAll :
        //   graphRef | DEFAULT | NAMED | ALL

        ST graphRefAll = g.getInstanceOf("graphRefAll");

        if (ctx.graphRef() != null) {
            graphRefAll.add("graphRef", visitGraphRef(ctx.graphRef()));
        } else if (ctx.DEFAULT() != null) {
            graphRefAll.add("DEFAULT", ctx.DEFAULT().getSymbol().getText().toUpperCase());
        } else if (ctx.NAMED() != null) {
            graphRefAll.add("NAMED", ctx.NAMED().getSymbol().getText().toUpperCase());
        } else if (ctx.ALL() != null) {
            graphRefAll.add("ALL", ctx.ALL().getSymbol().getText().toUpperCase());
        }

        return graphRefAll;
    }

    @Override
    public ST visitQuadPattern(SparqlParser.QuadPatternContext ctx) {
        // quadPattern :
        //   OPEN_CURLY_BRACE quads CLOSE_CURLY_BRACE

        ST quadPattern = g.getInstanceOf("quadPattern");

        quadPattern.add("quads", visitQuads(ctx.quads()));

        return quadPattern;
    }

    @Override
    public ST visitQuadData(SparqlParser.QuadDataContext ctx) {
        // quadData :
        //   OPEN_CURLY_BRACE quads CLOSE_CURLY_BRACE

        ST quadData = g.getInstanceOf("quadData");

        quadData.add("quads", visitQuads(ctx.quads()));

        return quadData;
    }

    @Override
    public ST visitQuads(SparqlParser.QuadsContext ctx) {
        // quads :
        //   triplesTemplate? quadsDetails*

        ST quads = g.getInstanceOf("quads");

        if (ctx.children != null) {
            for (ParseTree c : ctx.children) {
                if (c instanceof SparqlParser.TriplesTemplateContext) {
                    quads.add("triplesTemplate", visitTriplesTemplate((SparqlParser.TriplesTemplateContext) c));
                } else if (c instanceof SparqlParser.QuadsDetailsContext) {
                    quads.add("quadsDetails", visitQuadsDetails((SparqlParser.QuadsDetailsContext) c));
                }
            }
        }
        return quads;
    }

    @Override
    public ST visitQuadsDetails(SparqlParser.QuadsDetailsContext ctx) {
        // quads :
        //   quadsNotTriples DOT? triplesTemplate?

        ST quadsDetails = g.getInstanceOf("quadsDetails");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.QuadsNotTriplesContext) {
                quadsDetails.add("quadsNotTriples", visitQuadsNotTriples((SparqlParser.QuadsNotTriplesContext) c));
            } else if (c instanceof SparqlParser.TriplesTemplateContext) {
                quadsDetails.add("triplesTemplate", visitTriplesTemplate((SparqlParser.TriplesTemplateContext) c));
            }
        }

        return quadsDetails;
    }

    @Override
    public ST visitQuadsNotTriples(SparqlParser.QuadsNotTriplesContext ctx) {
        // quadsNotTriples :
        //   GRAPH varOrIRI OPEN_CURLY_BRACE triplesTemplate? CLOSE_CURLY_BRACE

        ST quadsNotTriples = g.getInstanceOf("quadsNotTriples");

        quadsNotTriples.add("varOrIRI", visitVarOrIRI(ctx.varOrIRI()));

        if (ctx.triplesTemplate() != null) {
            quadsNotTriples.add("triplesTemplate", visitTriplesTemplate(ctx.triplesTemplate()));
        }

        return quadsNotTriples;
    }

    @Override
    public ST visitTriplesTemplate(SparqlParser.TriplesTemplateContext ctx) {
        // triplesTemplate :
        //   triplesSameSubject (DOT triplesSameSubject?)*

        ST triplesTemplate = g.getInstanceOf("triplesTemplate");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.TriplesSameSubjectContext) {
                triplesTemplate.add("triplesSameSubject",
                        visitTriplesSameSubject((SparqlParser.TriplesSameSubjectContext) c));
            }
        }

        return triplesTemplate;
    }

    @Override
    public ST visitGroupGraphPattern(SparqlParser.GroupGraphPatternContext ctx) {
        // groupGraphPattern :
        //   OPEN_CURLY_BRACE (subSelect | groupGraphPatternSub) CLOSE_CURLY_BRACE

        ST groupGraphPattern = g.getInstanceOf("groupGraphPattern");

        if (ctx.subSelect() != null) {
            groupGraphPattern.add("subSelect", visitSubSelect(ctx.subSelect()));
        } else if (ctx.groupGraphPatternSub() != null) {
            groupGraphPattern.add("groupGraphPatternSub", visitGroupGraphPatternSub(ctx.groupGraphPatternSub()));
        }

        return groupGraphPattern;
    }

    @Override
    public ST visitGroupGraphPatternSub(SparqlParser.GroupGraphPatternSubContext ctx) {
        // groupGraphPatternSub :
        //   triplesBlock? groupGraphPatternSubList*

        ST groupGraphPatternSub = g.getInstanceOf("groupGraphPatternSub");

        if (ctx.children != null) {
            for (ParseTree c : ctx.children) {
                if (c instanceof SparqlParser.GroupGraphPatternSubListContext) {
                    groupGraphPatternSub.add("groupGraphPatternSubList",
                            visitGroupGraphPatternSubList((SparqlParser.GroupGraphPatternSubListContext) c));
                } else if (c instanceof SparqlParser.TriplesBlockContext) {
                    groupGraphPatternSub.add("triplesBlock",
                            visitTriplesBlock((SparqlParser.TriplesBlockContext) c));
                }
            }
        }

        return groupGraphPatternSub;
    }

    @Override
    public ST visitGroupGraphPatternSubList(SparqlParser.GroupGraphPatternSubListContext ctx) {
        // groupGraphPatternSubList :
        //    graphPatternNotTriples DOT? triplesBlock?

        ST groupGraphPatternSubList = g.getInstanceOf("groupGraphPatternSubList");

        groupGraphPatternSubList.add("graphPatternNotTriples",
                visitGraphPatternNotTriples(ctx.graphPatternNotTriples()));

        if (ctx.triplesBlock() != null) {
            groupGraphPatternSubList.add("triplesBlock", visitTriplesBlock(ctx.triplesBlock()));
        }

        return groupGraphPatternSubList;
    }

    @Override
    public ST visitTriplesBlock(SparqlParser.TriplesBlockContext ctx) {
        // triplesBlock :
        //   triplesSameSubjectPath (DOT triplesSameSubjectPath?)*

        ST triplesBlock = g.getInstanceOf("triplesBlock");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.TriplesSameSubjectPathContext) {
                triplesBlock.add("triplesSameSubjectPath",
                        visitTriplesSameSubjectPath((SparqlParser.TriplesSameSubjectPathContext) c));
            }
        }

        return triplesBlock;
    }

    @Override
    public ST visitGraphPatternNotTriples(SparqlParser.GraphPatternNotTriplesContext ctx) {
        // graphPatternNotTriples :
        //   groupOrUnionGraphPattern | optionalGraphPattern | minusGraphPattern | graphGraphPattern | serviceGraphPattern | filter | bind | inlineData

        ST graphPatternNotTriples = g.getInstanceOf("graphPatternNotTriples");

        if (ctx.groupOrUnionGraphPattern() != null) {
            graphPatternNotTriples.add("groupOrUnionGraphPattern",
                    visitGroupOrUnionGraphPattern(ctx.groupOrUnionGraphPattern()));
        } else if (ctx.optionalGraphPattern() != null) {
            graphPatternNotTriples.add("optionalGraphPattern",
                    visitOptionalGraphPattern(ctx.optionalGraphPattern()));
        } else if (ctx.minusGraphPattern() != null) {
            graphPatternNotTriples.add("minusGraphPattern", visitMinusGraphPattern(ctx.minusGraphPattern()));
        } else if (ctx.graphGraphPattern() != null) {
            graphPatternNotTriples.add("graphGraphPattern", visitGraphGraphPattern(ctx.graphGraphPattern()));
        } else if (ctx.serviceGraphPattern() != null) {
            graphPatternNotTriples.add("serviceGraphPattern", visitServiceGraphPattern(ctx.serviceGraphPattern()));
        } else if (ctx.filter() != null) {
            graphPatternNotTriples.add("filter", visitFilter(ctx.filter()));
        } else if (ctx.bind() != null) {
            graphPatternNotTriples.add("bind", visitBind(ctx.bind()));
        } else if (ctx.inlineData() != null) {
            graphPatternNotTriples.add("inlineData", visitInlineData(ctx.inlineData()));
        }

        return graphPatternNotTriples;
    }

    @Override
    public ST visitOptionalGraphPattern(SparqlParser.OptionalGraphPatternContext ctx) {
        // optionalGraphPattern :
        //   OPTIONAL groupGraphPattern

        ST optionalGraphPattern = g.getInstanceOf("optionalGraphPattern");

        optionalGraphPattern.add("groupGraphPattern", visitGroupGraphPattern(ctx.groupGraphPattern()));

        return optionalGraphPattern;
    }

    @Override
    public ST visitGraphGraphPattern(SparqlParser.GraphGraphPatternContext ctx) {
        // graphGraphPattern :
        //   GRAPH varOrIRIref groupGraphPattern

        ST graphGraphPattern = g.getInstanceOf("graphGraphPattern");

        graphGraphPattern.add("varOrIRI", visitVarOrIRI(ctx.varOrIRI()));

        graphGraphPattern.add("groupGraphPattern", visitGroupGraphPattern(ctx.groupGraphPattern()));

        return graphGraphPattern;
    }

    @Override
    public ST visitServiceGraphPattern(SparqlParser.ServiceGraphPatternContext ctx) {
        // serviceGraphPattern :
        //   SERVICE SILENT? varOrIRI groupGraphPattern

        ST serviceGraphPattern = g.getInstanceOf("serviceGraphPattern");

        if (ctx.SILENT() != null) {
            serviceGraphPattern.add("SILENT", ctx.SILENT().getSymbol().getText());
        }

        serviceGraphPattern.add("varOrIRI", visitVarOrIRI(ctx.varOrIRI()));

        serviceGraphPattern.add("groupGraphPattern", visitGroupGraphPattern(ctx.groupGraphPattern()));

        return serviceGraphPattern;
    }

    @Override
    public ST visitBind(SparqlParser.BindContext ctx) {
        // bind :
        //  BIND OPEN_BRACE expression AS var CLOSE_BRACE

        ST bind = g.getInstanceOf("bind");

        bind.add("expression", visit(ctx.expression()));

        bind.add("var", visitVar(ctx.var()));

        return bind;
    }

    @Override
    public ST visitInlineData(SparqlParser.InlineDataContext ctx) {
        // inlineData :
        //  VALUES dataBlock

        ST inlineData = g.getInstanceOf("inlineData");

        inlineData.add("dataBlock", visitDataBlock(ctx.dataBlock()));

        return inlineData;
    }

    @Override
    public ST visitDataBlock(SparqlParser.DataBlockContext ctx) {
        // dataBlock :
        //  inlineDataOneVar | inlineDataFull

        ST dataBlock = g.getInstanceOf("dataBlock");

        if (ctx.inlineDataOneVar() != null) {
            dataBlock.add("inlineDataOneVar", visitInlineDataOneVar(ctx.inlineDataOneVar()));
        } else if (ctx.inlineDataFull() != null) {
            dataBlock.add("inlineDataFull", visitInlineDataFull(ctx.inlineDataFull()));
        }

        return dataBlock;
    }

    @Override
    public ST visitInlineDataOneVar(SparqlParser.InlineDataOneVarContext ctx) {
        // inlineDataOneVar :
        //  var OPEN_CURLY_BRACE dataBlockValue* CLOSE_CURLY_BRACE

        ST inlineDataOneVar = g.getInstanceOf("inlineDataOneVar");

        if (ctx.children != null) {
            for (ParseTree c : ctx.children) {
                if (c instanceof SparqlParser.DataBlockValueContext) {
                    inlineDataOneVar.add("dataBlockValue",
                            visitDataBlockValue((SparqlParser.DataBlockValueContext) c));
                } else if (c instanceof SparqlParser.VarContext) {
                    inlineDataOneVar.add("var", visitVar((SparqlParser.VarContext) c));
                }
            }
        }
        return inlineDataOneVar;
    }

    @Override
    public ST visitInlineDataFull(SparqlParser.InlineDataFullContext ctx) {
        // inlineDataFull :
        //  (OPEN_BRACE var* CLOSE_BRACE) OPEN_CURLY_BRACE dataBlockValues* CLOSE_CURLY_BRACE

        ST inlineDataFull = g.getInstanceOf("inlineDataFull");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.VarContext) {
                inlineDataFull.add("var", visitVar((SparqlParser.VarContext) c));
            } else if (c instanceof SparqlParser.DataBlockValuesContext) {
                inlineDataFull.add("dataBlockValues",
                        visitDataBlockValues((SparqlParser.DataBlockValuesContext) c));
            }
        }

        return inlineDataFull;
    }

    @Override
    public ST visitDataBlockValues(SparqlParser.DataBlockValuesContext ctx) {
        // dataBlockValues :
        //  OPEN_BRACE dataBlockValue* CLOSE_BRACE

        ST dataBlockValues = g.getInstanceOf("dataBlockValues");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.DataBlockValueContext) {
                dataBlockValues.add("dataBlockValue", visitDataBlockValue((SparqlParser.DataBlockValueContext) c));
            }
        }

        return dataBlockValues;
    }

    @Override
    public ST visitDataBlockValue(SparqlParser.DataBlockValueContext ctx) {
        // dataBlockValue :
        //  iri | rdfLiteral | numericLiteral | booleanLiteral | UNDEF

        ST dataBlockValue = g.getInstanceOf("dataBlockValue");

        if (ctx.iri() != null) {
            dataBlockValue.add("iri", visitIri(ctx.iri()));
        } else if (ctx.rdfLiteral() != null) {
            dataBlockValue.add("rdfLiteral", visitRdfLiteral(ctx.rdfLiteral()));
        } else if (ctx.numericLiteral() != null) {
            dataBlockValue.add("numericLiteral", visitNumericLiteral(ctx.numericLiteral()));
        } else if (ctx.booleanLiteral() != null) {
            dataBlockValue.add("booleanLiteral", visitBooleanLiteral(ctx.booleanLiteral()));
        } else if (ctx.UNDEF() != null) {
            dataBlockValue.add("UNDEF", ctx.UNDEF().getSymbol().getText());
        }

        return dataBlockValue;
    }

    @Override
    public ST visitMinusGraphPattern(SparqlParser.MinusGraphPatternContext ctx) {
        // minusGraphPattern :
        //   MINUS groupGraphPattern

        ST minusGraphPattern = g.getInstanceOf("minusGraphPattern");

        minusGraphPattern.add("groupGraphPattern", visitGroupGraphPattern(ctx.groupGraphPattern()));

        return minusGraphPattern;
    }

    @Override
    public ST visitGroupOrUnionGraphPattern(SparqlParser.GroupOrUnionGraphPatternContext ctx) {
        // groupOrUnionGraphPattern :
        //   groupGraphPattern (UNION groupGraphPattern)*

        ST groupOrUnionGraphPattern = g.getInstanceOf("groupOrUnionGraphPattern");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.GroupGraphPatternContext) {
                groupOrUnionGraphPattern.add("groupGraphPattern",
                        visitGroupGraphPattern((SparqlParser.GroupGraphPatternContext) c));
            }
        }

        return groupOrUnionGraphPattern;
    }

    @Override
    public ST visitFilter(SparqlParser.FilterContext ctx) {
        // filter :
        //   FILTER constraint

        ST filter = g.getInstanceOf("filter");

        filter.add("constraint", visitConstraint(ctx.constraint()));

        return filter;
    }

    @Override
    public ST visitConstraint(SparqlParser.ConstraintContext ctx) {
        // constraint :
        //   '(' expression ')' | builtInCall | functionCall

        ST constraint = g.getInstanceOf("constraint");

        if (ctx.expression() != null) {
            constraint.add("expression", visit(ctx.expression()));
        } else if (ctx.builtInCall() != null) {
            constraint.add("builtInCall", visitBuiltInCall(ctx.builtInCall()));
        } else if (ctx.functionCall() != null) {
            constraint.add("functionCall", visitFunctionCall(ctx.functionCall()));
        }

        return constraint;
    }

    @Override
    public ST visitFunctionCall(SparqlParser.FunctionCallContext ctx) {
        // functionCall :
        //   iri argList

        ST functionCall = g.getInstanceOf("functionCall");

        functionCall.add("iri", visitIri(ctx.iri()));

        functionCall.add("argList", visitArgList(ctx.argList()));

        return functionCall;
    }

    @Override
    public ST visitArgList(SparqlParser.ArgListContext ctx) {
        // argList :
        //   OPEN_BRACE (DISTINCT? expressionList|) CLOSE_BRACE

        ST argList = g.getInstanceOf("argList");

        if (ctx.DISTINCT() != null) {
            argList.add("DISTINCT", ctx.DISTINCT().getSymbol().getText());
        }

        if (ctx.expressionList() != null) {
            argList.add("expressionList", visitExpressionList(ctx.expressionList()));
        }

        return argList;
    }

    @Override
    public ST visitExpressionList(SparqlParser.ExpressionListContext ctx) {
        // expressionList :
        //   expression (COMMA expression)*

        ST expressionList = g.getInstanceOf("expressionList");

        if (ctx.children != null) {
            for (ParseTree c : ctx.children) {
                if (c instanceof SparqlParser.ExpressionContext) {
                    expressionList.add("expression", visit((SparqlParser.ExpressionContext) c));
                }
            }
        }

        return expressionList;
    }

    @Override
    public ST visitConstructTemplate(SparqlParser.ConstructTemplateContext ctx) {
        // constructTemplate :
        //   OPEN_CURLY_BRACE constructTriples? CLOSE_CURLY_BRACE

        ST constructTemplate = g.getInstanceOf("constructTemplate");

        if (ctx.constructTriples() != null) {
            constructTemplate.add("constructTriples", visitConstructTriples(ctx.constructTriples()));
        }

        return constructTemplate;
    }

    @Override
    public ST visitConstructTriples(SparqlParser.ConstructTriplesContext ctx) {
        // constructTriples :
        //   triplesSameSubject (DOT constructTriples?)* 

        ST constructTriples = g.getInstanceOf("constructTriples");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.ConstructTriplesContext) {
                constructTriples.add("constructTriples",
                        visitConstructTriples((SparqlParser.ConstructTriplesContext) c));
            } else if (c instanceof SparqlParser.TriplesSameSubjectContext) {
                constructTriples.add("triplesSameSubject",
                        visitTriplesSameSubject((SparqlParser.TriplesSameSubjectContext) c));
            }
        }

        return constructTriples;
    }

    @Override
    public ST visitTriplesSameSubject(SparqlParser.TriplesSameSubjectContext ctx) {
        // triplesSameSubject :
        //   varOrTerm propertyListNotEmpty | triplesNode propertyList 

        ST triplesSameSubject = g.getInstanceOf("triplesSameSubject");

        if (ctx.varOrTerm() != null) {
            triplesSameSubject.add("varOrTerm", visitVarOrTerm(ctx.varOrTerm()));
            triplesSameSubject.add("propertyListNotEmpty", visitPropertyListNotEmpty(ctx.propertyListNotEmpty()));
        } else {
            triplesSameSubject.add("triplesNode", visitTriplesNode(ctx.triplesNode()));
            triplesSameSubject.add("propertyList", visitPropertyList(ctx.propertyList()));
        }

        return triplesSameSubject;
    }

    @Override
    public ST visitPropertyList(SparqlParser.PropertyListContext ctx) {
        // propertyList
        //   propertyListNotEmpty?

        ST propertyList = g.getInstanceOf("propertyList");

        if (ctx.propertyListNotEmpty() != null) {
            propertyList.add("propertyListNotEmpty", visitPropertyListNotEmpty(ctx.propertyListNotEmpty()));
        }

        return propertyList;
    }

    @Override
    public ST visitPropertyListNotEmpty(SparqlParser.PropertyListNotEmptyContext ctx) {
        // propertyListNotEmpty :
        //   verb objectList (SEMICOLON (verb objectList)?)* 

        ST propertyListNotEmpty = g.getInstanceOf("propertyListNotEmpty");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.VerbContext) {
                propertyListNotEmpty.add("verb", visitVerb((SparqlParser.VerbContext) c));
            } else if (c instanceof SparqlParser.ObjectListContext) {
                propertyListNotEmpty.add("objectList", visitObjectList((SparqlParser.ObjectListContext) c));
            }
        }

        return propertyListNotEmpty;
    }

    @Override
    public ST visitVerb(SparqlParser.VerbContext ctx) {
        // verb :
        //   varOrIRI | A

        ST verb = g.getInstanceOf("verb");

        if (ctx.varOrIRI() != null) {
            verb.add("varOrIRI", visitVarOrIRI(ctx.varOrIRI()));
        } else if (ctx.A() != null) {
            verb.add("A", ctx.A().getSymbol().getText());
        }

        return verb;
    }

    @Override
    public ST visitObjectList(SparqlParser.ObjectListContext ctx) {
        // objectList :
        //   object (COMMA object)*

        ST objectList = g.getInstanceOf("objectList");

        if (ctx != null) {
            for (ParseTree c : ctx.children) {
                if (c instanceof SparqlParser.ObjectContext) {
                    objectList.add("object", visitObject((SparqlParser.ObjectContext) c));
                }
            }
        }
        return objectList;
    }

    @Override
    public ST visitObject(SparqlParser.ObjectContext ctx) {
        // object :
        //   graphNode

        ST object = g.getInstanceOf("object");

        object.add("graphNode", visitGraphNode(ctx.graphNode()));

        return object;
    }

    @Override
    public ST visitTriplesSameSubjectPath(SparqlParser.TriplesSameSubjectPathContext ctx) {
        // triplesSameSubjectPath :
        //   varOrTerm propertyListPathNotEmpty | triplesNodePath propertyListPath

        ST triplesSameSubjectPath = g.getInstanceOf("triplesSameSubjectPath");

        if (ctx.varOrTerm() != null) {
            triplesSameSubjectPath.add("varOrTerm", visitVarOrTerm(ctx.varOrTerm()));
            triplesSameSubjectPath.add("propertyListPathNotEmpty",
                    visitPropertyListPathNotEmpty(ctx.propertyListPathNotEmpty()));
        } else {
            triplesSameSubjectPath.add("triplesNodePath", visitTriplesNodePath(ctx.triplesNodePath()));
            triplesSameSubjectPath.add("propertyListPath", visitPropertyListPath(ctx.propertyListPath()));
        }

        return triplesSameSubjectPath;
    }

    @Override
    public ST visitPropertyListPath(SparqlParser.PropertyListPathContext ctx) {
        // propertyListPath :
        //   propertyListPathNotEmpty?

        ST propertyListPath = g.getInstanceOf("propertyListPath");

        if (ctx.propertyListPathNotEmpty() != null) {
            propertyListPath.add("propertyListPathNotEmpty",
                    visitPropertyListPathNotEmpty(ctx.propertyListPathNotEmpty()));
        }

        return propertyListPath;
    }

    @Override
    public ST visitPropertyListPathNotEmpty(SparqlParser.PropertyListPathNotEmptyContext ctx) {
        // propertyListPathNotEmpty :
        //  (verbPath|verbSimple) objectListPath (SEMICOLON propertyListPathNotEmptyList?)* SEMICOLON?

        ST propertyListPathNotEmpty = g.getInstanceOf("propertyListPathNotEmpty");

        if (ctx.verbPath() != null) {
            propertyListPathNotEmpty.add("verbPath", visitVerbPath(ctx.verbPath()));
        } else if (ctx.verbSimple() != null) {
            propertyListPathNotEmpty.add("verbSimple", visitVerbSimple(ctx.verbSimple()));
        }

        propertyListPathNotEmpty.add("objectListPath", visitObjectListPath(ctx.objectListPath()));

        for (int i = 3; i < ctx.getChildCount(); i++) {
            ParseTree c = ctx.getChild(i);
            if (c instanceof SparqlParser.PropertyListPathNotEmptyListContext) {
                propertyListPathNotEmpty.add("propertyListPathNotEmptyList",
                        visitPropertyListPathNotEmptyList((SparqlParser.PropertyListPathNotEmptyListContext) c));
            }
        }

        return propertyListPathNotEmpty;
    }

    @Override
    public ST visitPropertyListPathNotEmptyList(SparqlParser.PropertyListPathNotEmptyListContext ctx) {
        // propertyListPathNotEmptyList :
        //  (verbPath|verbSimple) objectList

        ST propertyListPathNotEmptyList = g.getInstanceOf("propertyListPathNotEmptyList");

        if (ctx.verbPath() != null) {
            propertyListPathNotEmptyList.add("verbPath", visitVerbPath(ctx.verbPath()));
        } else if (ctx.verbSimple() != null) {
            propertyListPathNotEmptyList.add("verbSimple", visitVerbSimple(ctx.verbSimple()));
        }

        propertyListPathNotEmptyList.add("objectList", visitObjectList(ctx.objectList()));

        return propertyListPathNotEmptyList;
    }

    @Override
    public ST visitVerbPath(SparqlParser.VerbPathContext ctx) {
        // verbPath :
        //   path

        ST verbPath = g.getInstanceOf("verbPath");

        verbPath.add("path", visitPath(ctx.path()));

        return verbPath;
    }

    @Override
    public ST visitVerbSimple(SparqlParser.VerbSimpleContext ctx) {
        // verbSimple :
        //   var

        ST verbSimple = g.getInstanceOf("verbSimple");

        verbSimple.add("var", visitVar(ctx.var()));

        return verbSimple;
    }

    @Override
    public ST visitObjectListPath(SparqlParser.ObjectListPathContext ctx) {
        // objectListPath :
        //   objectPath (COMMA objectPath)*

        ST objectListPath = g.getInstanceOf("objectListPath");

        if (ctx != null) {
            for (ParseTree c : ctx.children) {
                if (c instanceof SparqlParser.ObjectPathContext) {
                    objectListPath.add("objectPath", visitObjectPath((SparqlParser.ObjectPathContext) c));
                }
            }
        }
        return objectListPath;
    }

    @Override
    public ST visitObjectPath(SparqlParser.ObjectPathContext ctx) {
        // objectPath :
        //   graphNodePath

        ST objectPath = g.getInstanceOf("objectPath");

        objectPath.add("graphNodePath", visitGraphNodePath(ctx.graphNodePath()));

        return objectPath;
    }

    @Override
    public ST visitPath(SparqlParser.PathContext ctx) {
        // path :
        //   pathAlternative

        ST path = g.getInstanceOf("path");

        path.add("pathAlternative", visitPathAlternative(ctx.pathAlternative()));

        return path;
    }

    @Override
    public ST visitPathAlternative(SparqlParser.PathAlternativeContext ctx) {
        // pathAlternative :
        //   pathSequence (PIPE pathSequence)*

        ST pathAlternative = g.getInstanceOf("pathAlternative");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.PathSequenceContext) {
                pathAlternative.add("pathSequence", visitPathSequence((SparqlParser.PathSequenceContext) c));
            }
        }

        return pathAlternative;
    }

    @Override
    public ST visitPathSequence(SparqlParser.PathSequenceContext ctx) {
        // pathSequence :
        //   pathEltOrInverse (DIVIDE pathEltOrInverse)*

        ST pathSequence = g.getInstanceOf("pathSequence");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.PathEltOrInverseContext) {
                pathSequence.add("pathEltOrInverse",
                        visitPathEltOrInverse((SparqlParser.PathEltOrInverseContext) c));
            }
        }

        return pathSequence;
    }

    @Override
    public ST visitPathElt(SparqlParser.PathEltContext ctx) {
        // pathElt :
        //   pathPrimary pathMod?

        ST pathElt = g.getInstanceOf("pathElt");

        pathElt.add("pathPrimary", visitPathPrimary(ctx.pathPrimary()));

        if (ctx.pathMod() != null) {
            pathElt.add("pathMod", visitPathMod(ctx.pathMod()));
        }

        return pathElt;
    }

    @Override
    public ST visitPathEltOrInverse(SparqlParser.PathEltOrInverseContext ctx) {
        // pathEltOrInverse :
        //   INVERSE? pathElt

        ST pathEltOrInverse = g.getInstanceOf("pathEltOrInverse");

        if (ctx.INVERSE() != null) {
            pathEltOrInverse.add("INVERSE", ctx.INVERSE().getSymbol().getText());
        }

        pathEltOrInverse.add("pathElt", visitPathElt(ctx.pathElt()));

        return pathEltOrInverse;
    }

    @Override
    public ST visitPathMod(SparqlParser.PathModContext ctx) {
        // pathMod :
        //   QUESTION_MARK | ASTERISK | PLUS_SIGN 

        ST pathMod = g.getInstanceOf("pathMod");

        if (ctx.op.getType() == SparqlParser.QUESTION_MARK) {
            pathMod.add("QUESTION_MARK", "?");
        } else if (ctx.op.getType() == SparqlParser.ASTERISK) {
            pathMod.add("ASTERISK", "*");
        } else if (ctx.op.getType() == SparqlParser.PLUS_SIGN) {
            pathMod.add("PLUS", "+");
        }

        return pathMod;
    }

    @Override
    public ST visitPathPrimary(SparqlParser.PathPrimaryContext ctx) {
        // pathPrimary :
        //   iri | A | NEGATION pathNegatedPropertySet | OPEN_BRACE path CLOSE_BRACE

        ST pathPrimary = g.getInstanceOf("pathPrimary");

        if (ctx.iri() != null) {
            pathPrimary.add("iri", visitIri(ctx.iri()));
        } else if (ctx.A() != null) {
            pathPrimary.add("A", ctx.A().getSymbol().getText());
        } else if (ctx.pathNegatedPropertySet() != null) {
            pathPrimary.add("pathNegatedPropertySet", visitPathNegatedPropertySet(ctx.pathNegatedPropertySet()));
        } else if (ctx.path() != null) {
            pathPrimary.add("path", visitPath(ctx.path()));
        }

        return pathPrimary;
    }

    @Override
    public ST visitPathNegatedPropertySet(SparqlParser.PathNegatedPropertySetContext ctx) {
        // pathNegatedPropertySet
        //   pathOneInPropertySet | OPEN_BRACE (pathOneInPropertySet (PIPE pathOneInPropertySet)*)? CLOSE_BRACE

        ST pathNegatedPropertySet = g.getInstanceOf("pathNegatedPropertySet");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.PathOneInPropertySetContext) {
                pathNegatedPropertySet.add("pathOneInPropertySet",
                        visitPathOneInPropertySet((SparqlParser.PathOneInPropertySetContext) c));
            }
        }

        return pathNegatedPropertySet;
    }

    @Override
    public ST visitPathOneInPropertySet(SparqlParser.PathOneInPropertySetContext ctx) {
        // pathOneInPropertySet :
        //   INVERSE? (iri | A)

        ST pathOneInPropertySet = g.getInstanceOf("pathOneInPropertySet");

        if (ctx.INVERSE() != null) {
            pathOneInPropertySet.add("INVERSE", ctx.INVERSE().getSymbol().getText());
        }

        if (ctx.iri() != null) {
            pathOneInPropertySet.add("iri", visitIri(ctx.iri()));
        } else if (ctx.A() != null) {
            pathOneInPropertySet.add("A", ctx.A().getSymbol().getText());
        }

        return pathOneInPropertySet;
    }

    @Override
    public ST visitInteger(SparqlParser.IntegerContext ctx) {
        // integer :
        //   INTEGER

        ST integer = g.getInstanceOf("integer");

        integer.add("INTEGER", ctx.INTEGER().getSymbol().getText());

        return integer;
    }

    @Override
    public ST visitTriplesNode(SparqlParser.TriplesNodeContext ctx) {
        // triplesNode :
        //   collection | blankNodePropertyList

        ST triplesNode = g.getInstanceOf("triplesNode");

        if (ctx.collection() != null) {
            triplesNode.add("collection", visitCollection(ctx.collection()));
        } else if (ctx.blankNodePropertyList() != null) {
            triplesNode.add("blankNodePropertyList", visitBlankNodePropertyList(ctx.blankNodePropertyList()));
        }

        return triplesNode;
    }

    @Override
    public ST visitBlankNodePropertyList(SparqlParser.BlankNodePropertyListContext ctx) {
        // blankNodePropertyList :
        //   OPEN_SQUARE_BRACKET propertyListNotEmpty CLOSE_SQUARE_BRACKET

        ST blankNodePropertyList = g.getInstanceOf("blankNodePropertyList");

        blankNodePropertyList.add("propertyListNotEmpty", visitPropertyListNotEmpty(ctx.propertyListNotEmpty()));

        return blankNodePropertyList;
    }

    @Override
    public ST visitTriplesNodePath(SparqlParser.TriplesNodePathContext ctx) {
        // triplesNodePath :
        //   collectionPath | blankNodePropertyListPath

        ST triplesNodePath = g.getInstanceOf("triplesNodePath");

        if (ctx.collectionPath() != null) {
            triplesNodePath.add("collectionPath", visitCollectionPath(ctx.collectionPath()));
        } else if (ctx.blankNodePropertyListPath() != null) {
            triplesNodePath.add("blankNodePropertyListPath",
                    visitBlankNodePropertyListPath(ctx.blankNodePropertyListPath()));
        }

        return triplesNodePath;
    }

    @Override
    public ST visitBlankNodePropertyListPath(SparqlParser.BlankNodePropertyListPathContext ctx) {
        // blankNodePropertyListPath :
        //   OPEN_SQUARE_BRACKET propertyListPathNotEmpty CLOSE_SQUARE_BRACKET

        ST blankNodePropertyListPath = g.getInstanceOf("blankNodePropertyListPath");

        blankNodePropertyListPath.add("propertyListPathNotEmpty",
                visitPropertyListPathNotEmpty(ctx.propertyListPathNotEmpty()));

        return blankNodePropertyListPath;
    }

    @Override
    public ST visitCollection(SparqlParser.CollectionContext ctx) {
        // collection :
        //   OPEN_BRACE graphNode+ CLOSE_BRACE

        ST collection = g.getInstanceOf("collection");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.GraphNodeContext) {
                collection.add("graphNode", visitGraphNode((SparqlParser.GraphNodeContext) c));
            }
        }

        return collection;
    }

    @Override
    public ST visitCollectionPath(SparqlParser.CollectionPathContext ctx) {
        // collectionPath :
        //   OPEN_BRACE graphNodePath+ CLOSE_BRACE

        ST collectionPath = g.getInstanceOf("collectionPath");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.GraphNodePathContext) {
                collectionPath.add("graphNodePath", visitGraphNodePath((SparqlParser.GraphNodePathContext) c));
            }
        }

        return collectionPath;
    }

    @Override
    public ST visitGraphNode(SparqlParser.GraphNodeContext ctx) {
        // graphNode :
        //   varOrTerm | triplesNode

        ST graphNode = g.getInstanceOf("graphNode");

        if (ctx.varOrTerm() != null) {
            graphNode.add("varOrTerm", visitVarOrTerm(ctx.varOrTerm()));
        } else if (ctx.triplesNode() != null) {
            graphNode.add("triplesNode", visitTriplesNode(ctx.triplesNode()));
        }

        return graphNode;
    }

    @Override
    public ST visitGraphNodePath(SparqlParser.GraphNodePathContext ctx) {
        // graphNodePath :
        //   varOrTerm | triplesNodePath

        ST graphNodePath = g.getInstanceOf("graphNodePath");

        if (ctx.varOrTerm() != null) {
            graphNodePath.add("varOrTerm", visitVarOrTerm(ctx.varOrTerm()));
        } else if (ctx.triplesNodePath() != null) {
            graphNodePath.add("triplesNodePath", visitTriplesNodePath(ctx.triplesNodePath()));
        }

        return graphNodePath;
    }

    @Override
    public ST visitVarOrTerm(SparqlParser.VarOrTermContext ctx) {
        // varOrTerm :
        //   var | graphTerm

        ST varOrTerm = g.getInstanceOf("varOrTerm");

        if (ctx.var() != null) {
            varOrTerm.add("var", visitVar(ctx.var()));
        } else if (ctx.graphTerm() != null) {
            varOrTerm.add("graphTerm", visitGraphTerm(ctx.graphTerm()));
        }

        return varOrTerm;
    }

    @Override
    public ST visitVarOrIRI(SparqlParser.VarOrIRIContext ctx) {
        // varOrIRI :
        //   var | iri

        ST varOrIRI = g.getInstanceOf("varOrIRI");

        if (ctx.var() != null) {
            varOrIRI.add("var", visitVar(ctx.var()));
        } else if (ctx.iri() != null) {
            varOrIRI.add("iri", visitIri(ctx.iri()));
        }

        return varOrIRI;
    }

    @Override
    public ST visitVar(SparqlParser.VarContext ctx) {
        // var :
        //   VAR1 | VAR2

        ST var = g.getInstanceOf("var");

        if (ctx.VAR1() != null) {
            var.add("value", ctx.VAR1().getSymbol().getText());
        } else if (ctx.VAR2() != null) {
            var.add("value", ctx.VAR2().getSymbol().getText());
        }

        return var;
    }

    @Override
    public ST visitGraphTerm(SparqlParser.GraphTermContext ctx) {
        // graphTerm
        //   iri | rdfLiteral | numericLiteral | booleanLiteral | blankNode | nil

        ST graphTerm = g.getInstanceOf("graphTerm");

        if (ctx.iri() != null) {
            graphTerm.add("iri", visitIri(ctx.iri()));
        } else if (ctx.rdfLiteral() != null) {
            graphTerm.add("rdfLiteral", visitRdfLiteral(ctx.rdfLiteral()));
        } else if (ctx.numericLiteral() != null) {
            graphTerm.add("numericLiteral", visitNumericLiteral(ctx.numericLiteral()));
        } else if (ctx.booleanLiteral() != null) {
            graphTerm.add("booleanLiteral", visitBooleanLiteral(ctx.booleanLiteral()));
        } else if (ctx.blankNode() != null) {
            graphTerm.add("blankNode", visitBlankNode(ctx.blankNode()));
        } else if (ctx.nil() != null) {
            graphTerm.add("nil", visitNil(ctx.nil()));
        }

        return graphTerm;
    }

    @Override
    public ST visitNil(SparqlParser.NilContext ctx) {
        // nil :
        //   OPEN_BRACE CLOSE_BRACE

        ST nil = g.getInstanceOf("nil");

        return nil;
    }

    @Override
    public ST visitBaseExpression(SparqlParser.BaseExpressionContext ctx) {
        // expression :
        //   primaryExpression

        ST baseExpression = g.getInstanceOf("baseExpression");

        baseExpression.add("primaryExpression", visitPrimaryExpression(ctx.primaryExpression()));

        return baseExpression;
    }

    @Override
    public ST visitUnaryMultiplicativeExpression(SparqlParser.UnaryMultiplicativeExpressionContext ctx) {
        // expression : 
        //   op=('*'|'/') expression 

        ST unaryMultiplicativeExpression = g.getInstanceOf("unaryMultiplicativeExpression");

        if (ctx.op.getType() == SparqlParser.ASTERISK) {
            unaryMultiplicativeExpression.add("MULTIPLY", "*");
        } else if (ctx.op.getType() == SparqlParser.DIVIDE) {
            unaryMultiplicativeExpression.add("DIVIDE", "/");
        }

        unaryMultiplicativeExpression.add("expression", visit(ctx.expression()));

        return unaryMultiplicativeExpression;
    }

    @Override
    public ST visitUnaryAdditiveExpression(SparqlParser.UnaryAdditiveExpressionContext ctx) {
        // expression : 
        //   (ADD|SUBTRACT) expression 

        ST unaryAdditiveExpression = g.getInstanceOf("unaryAdditiveExpression");

        if (ctx.op.getType() == SparqlParser.PLUS_SIGN) {
            unaryAdditiveExpression.add("ADD", "+");
        } else if (ctx.op.getType() == SparqlParser.MINUS_SIGN) {
            unaryAdditiveExpression.add("SUBTRACT", "-");
        }

        unaryAdditiveExpression.add("expression", visit(ctx.expression()));

        return unaryAdditiveExpression;
    }

    @Override
    public ST visitUnaryNegationExpression(SparqlParser.UnaryNegationExpressionContext ctx) {
        // expression : 
        //   NEGATION expression 

        ST unaryNegationExpression = g.getInstanceOf("unaryNegationExpression");

        unaryNegationExpression.add("expression", visit(ctx.expression()));

        return unaryNegationExpression;
    }

    @Override
    public ST visitMultiplicativeExpression(SparqlParser.MultiplicativeExpressionContext ctx) {
        // expression : 
        //   expression op=(ASTERISK|DIVIDE) expression 

        ST multiplicativeExpression = g.getInstanceOf("multiplicativeExpression");

        multiplicativeExpression.add("leftExpression", visit(ctx.expression(0)));

        if (ctx.op.getType() == SparqlParser.ASTERISK) {
            multiplicativeExpression.add("MULTIPLY", "*");
        } else if (ctx.op.getType() == SparqlParser.DIVIDE) {
            multiplicativeExpression.add("DIVIDE", "/");
        }

        multiplicativeExpression.add("rightExpression", visit(ctx.expression(1)));

        return multiplicativeExpression;
    }

    @Override
    public ST visitAdditiveExpression(SparqlParser.AdditiveExpressionContext ctx) {
        // expression : 
        //   expression op=(PLUS_SIGN|MINUS_SIGN) expression 

        ST additiveExpression = g.getInstanceOf("additiveExpression");

        additiveExpression.add("leftExpression", visit(ctx.expression(0)));

        if (ctx.op.getType() == SparqlParser.PLUS_SIGN) {
            additiveExpression.add("ADD", "+");
        } else if (ctx.op.getType() == SparqlParser.MINUS_SIGN) {
            additiveExpression.add("SUBTRACT", "-");
        }

        additiveExpression.add("rightExpression", visit(ctx.expression(1)));

        return additiveExpression;
    }

    @Override
    public ST visitUnarySignedLiteralExpression(SparqlParser.UnarySignedLiteralExpressionContext ctx) {
        // expression : 
        //   expression unaryLiteralExpression

        ST unarySignedLiteralExpression = g.getInstanceOf("unarySignedLiteralExpression");

        unarySignedLiteralExpression.add("expression", visit(ctx.expression()));
        unarySignedLiteralExpression.add("unaryLiteralExpression", visit(ctx.unaryLiteralExpression()));

        return unarySignedLiteralExpression;
    }

    @Override
    public ST visitRelationalSetExpression(SparqlParser.RelationalSetExpressionContext ctx) {
        // expression : 
        //   expression NOT? IN '(' expressionList? ')' 

        ST relationalSetExpression = g.getInstanceOf("relationalSetExpression");

        relationalSetExpression.add("leftExpression", visit(ctx.expression()));

        if (ctx.NOT() != null) {
            relationalSetExpression.add("NOT", ctx.NOT().getText());
        }

        relationalSetExpression.add("IN", ctx.IN().getText());

        if (ctx.expressionList() != null) {
            relationalSetExpression.add("expressionList", visit(ctx.expressionList()));
        }

        return relationalSetExpression;
    }

    @Override
    public ST visitRelationalExpression(SparqlParser.RelationalExpressionContext ctx) {
        // expression :
        //   expression op=('='|'!='|'<'|'>'|'<='|'>=') expression

        ST relationalExpression = g.getInstanceOf("relationalExpression");

        relationalExpression.add("leftExpression", visit(ctx.expression(0)));

        if (ctx.op.getType() == SparqlParser.EQUAL) {
            relationalExpression.add("operator", ctx.op.getText());
        } else if (ctx.op.getType() == SparqlParser.NOT_EQUAL) {
            relationalExpression.add("operator", ctx.op.getText());
        } else if (ctx.op.getType() == SparqlParser.LESS) {
            relationalExpression.add("operator", ctx.op.getText());
        } else if (ctx.op.getType() == SparqlParser.GREATER) {
            relationalExpression.add("operator", ctx.op.getText());
        } else if (ctx.op.getType() == SparqlParser.LESS_EQUAL) {
            relationalExpression.add("operator", ctx.op.getText());
        } else if (ctx.op.getType() == SparqlParser.GREATER_EQUAL) {
            relationalExpression.add("operator", ctx.op.getText());
        }

        relationalExpression.add("rightExpression", visit(ctx.expression(1)));

        return relationalExpression;
    }

    @Override
    public ST visitConditionalAndExpression(SparqlParser.ConditionalAndExpressionContext ctx) {
        // expression :
        //   expression (&& expression)

        ST conditionalAndExpression = g.getInstanceOf("conditionalAndExpression");

        conditionalAndExpression.add("leftExpression", visit(ctx.expression(0)));

        conditionalAndExpression.add("rightExpression", visit(ctx.expression(1)));

        return conditionalAndExpression;
    }

    @Override
    public ST visitConditionalOrExpression(SparqlParser.ConditionalOrExpressionContext ctx) {
        // expression :
        //   expression (|| expression)

        ST conditionalOrExpression = g.getInstanceOf("conditionalOrExpression");

        conditionalOrExpression.add("leftExpression", visit(ctx.expression(0)));

        conditionalOrExpression.add("rightExpression", visit(ctx.expression(1)));

        return conditionalOrExpression;
    }

    @Override
    public ST visitUnaryLiteralExpression(SparqlParser.UnaryLiteralExpressionContext ctx) {
        // expression :
        //   (numericLiteralPositive|numericLiteralNegative) (op=('*'|'/') unaryExpression)? 

        ST unaryLiteralExpression = g.getInstanceOf("unaryLiteralExpression");

        if (ctx.numericLiteralPositive() != null) {
            unaryLiteralExpression.add("numericLiteralPositive",
                    visitNumericLiteralPositive(ctx.numericLiteralPositive()));
        } else if (ctx.numericLiteralNegative() != null) {
            unaryLiteralExpression.add("numericLiteralNegative",
                    visitNumericLiteralNegative(ctx.numericLiteralNegative()));
        }

        if (ctx.op != null) {
            if (ctx.op.getType() == SparqlParser.ASTERISK) {
                unaryLiteralExpression.add("operator", "*");
            } else if (ctx.op.getType() == SparqlParser.DIVIDE) {
                unaryLiteralExpression.add("operator", "/");
            }
        }

        if (ctx.unaryExpression() != null) {
            unaryLiteralExpression.add("unaryExpression", visitUnaryExpression(ctx.unaryExpression()));
        }

        return unaryLiteralExpression;
    }

    @Override
    public ST visitUnaryExpression(SparqlParser.UnaryExpressionContext ctx) {
        // expression :
        //    op=('!'|'+'|'-')? primaryExpression

        ST unaryExpression = g.getInstanceOf("unaryExpression");

        if (ctx.op != null) {
            if (ctx.op.getType() == SparqlParser.NEGATION) {
                unaryExpression.add("operator", "!");
            } else if (ctx.op.getType() == SparqlParser.PLUS_SIGN) {
                unaryExpression.add("operator", "+");
            } else if (ctx.op.getType() == SparqlParser.MINUS_SIGN) {
                unaryExpression.add("operator", "-");
            }
        }

        unaryExpression.add("primaryExpression", visit(ctx.primaryExpression()));

        return unaryExpression;
    }

    @Override
    public ST visitPrimaryExpression(SparqlParser.PrimaryExpressionContext ctx) {
        // expression :
        //   '(' expression ')' | builtInCall | iriRefOrFunction | rdfLiteral | numericLiteral | booleanLiteral | var

        ST primaryExpression = g.getInstanceOf("primaryExpression");

        if (ctx.expression() != null) {
            primaryExpression.add("expression", visit(ctx.expression()));
        } else if (ctx.builtInCall() != null) {
            primaryExpression.add("builtInCall", visitBuiltInCall(ctx.builtInCall()));
        } else if (ctx.iriRefOrFunction() != null) {
            primaryExpression.add("iriRefOrFunction", visitIriRefOrFunction(ctx.iriRefOrFunction()));
        } else if (ctx.rdfLiteral() != null) {
            primaryExpression.add("rdfLiteral", visitRdfLiteral(ctx.rdfLiteral()));
        } else if (ctx.numericLiteral() != null) {
            primaryExpression.add("numericLiteral", visitNumericLiteral(ctx.numericLiteral()));
        } else if (ctx.booleanLiteral() != null) {
            primaryExpression.add("booleanLiteral", visitBooleanLiteral(ctx.booleanLiteral()));
        } else if (ctx.var() != null) {
            primaryExpression.add("var", visitVar(ctx.var()));
        }

        return primaryExpression;
    }

    @Override
    public ST visitBuiltInCall(SparqlParser.BuiltInCallContext ctx) {
        // builtInCall :
        //   aggregate
        //   | STR OPEN_BRACE expression CLOSE_BRACE
        //   | LANG OPEN_BRACE expression CLOSE_BRACE
        //   | LANGMATCHES OPEN_BRACE expression COMMA expression CLOSE_BRACE
        //   | DATATYPE OPEN_BRACE expression CLOSE_BRACE
        //   | BOUND OPEN_BRACE var CLOSE_BRACE
        //   | IRI OPEN_BRACE expression CLOSE_BRACE
        //   | URI OPEN_BRACE expression CLOSE_BRACE
        //   | BNODE OPEN_BRACE expression? CLOSE_BRACE
        //   | RAND nil
        //   | ABS OPEN_BRACE expression CLOSE_BRACE
        //   | CEIL OPEN_BRACE expression CLOSE_BRACE
        //   | FLOOR OPEN_BRACE expression CLOSE_BRACE
        //   | ROUND OPEN_BRACE expression CLOSE_BRACE
        //   | CONCAT (expressionList?)
        //   | subStringExpression
        //   | strReplaceExpression
        //   | STRLEN OPEN_BRACE expression CLOSE_BRACE
        //   | UCASE OPEN_BRACE expression CLOSE_BRACE
        //   | LCASE OPEN_BRACE expression CLOSE_BRACE
        //   | ENCODE_FOR_URI OPEN_BRACE expression CLOSE_BRACE
        //   | CONTAINS OPEN_BRACE expression COMMA expression CLOSE_BRACE
        //   | STRSTARTS OPEN_BRACE expression COMMA expression CLOSE_BRACE
        //   | STRENDS OPEN_BRACE expression COMMA expression CLOSE_BRACE
        //   | STRBEFORE OPEN_BRACE expression COMMA expression CLOSE_BRACE
        //   | STRAFTER OPEN_BRACE expression COMMA expression CLOSE_BRACE
        //   | YEAR OPEN_BRACE expression CLOSE_BRACE
        //   | MONTH OPEN_BRACE expression CLOSE_BRACE
        //   | DAY OPEN_BRACE expression CLOSE_BRACE
        //   | HOURS OPEN_BRACE expression CLOSE_BRACE
        //   | MINUTES OPEN_BRACE expression CLOSE_BRACE
        //   | SECONDS OPEN_BRACE expression CLOSE_BRACE
        //   | TIMEZONE OPEN_BRACE expression CLOSE_BRACE
        //   | TZ OPEN_BRACE expression CLOSE_BRACE
        //   | NOW nil
        //   | UUID nil
        //   | STRUUID nil
        //   | MD5 OPEN_BRACE expression CLOSE_BRACE
        //   | SHA1 OPEN_BRACE expression CLOSE_BRACE
        //   | SHA256 OPEN_BRACE expression CLOSE_BRACE
        //   | SHA384 OPEN_BRACE expression CLOSE_BRACE
        //   | SHA512 OPEN_BRACE expression CLOSE_BRACE
        //   | COALESCE (expressionList?)
        //   | IF OPEN_BRACE e1=expression COMMA e2=expression COMMA e3=expression CLOSE_BRACE
        //   | STRLANG OPEN_BRACE expression COMMA expression CLOSE_BRACE
        //   | STRDT OPEN_BRACE expression COMMA expression CLOSE_BRACE
        //   | SAMETERM OPEN_BRACE expression COMMA expression CLOSE_BRACE
        //   | ISIRI OPEN_BRACE expression CLOSE_BRACE
        //   | ISURI OPEN_BRACE expression CLOSE_BRACE
        //   | ISBLANK OPEN_BRACE expression CLOSE_BRACE
        //   | ISLITERAL OPEN_BRACE expression CLOSE_BRACE
        //   | ISNUMERIC OPEN_BRACE expression CLOSE_BRACE
        //   | regexExpression
        //   | existsFunction
        //   | notExistsFunction

        ST builtInCall = g.getInstanceOf("builtInCall");

        if (ctx.aggregate() != null) {
            builtInCall.add("aggregate", visitAggregate(ctx.aggregate()));
        } else if (ctx.STR() != null) {
            builtInCall.add("builtInFunction", ctx.STR().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.LANG() != null) {
            builtInCall.add("builtInFunction", ctx.LANG().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.LANGMATCHES() != null) {
            builtInCall.add("builtInFunction", ctx.LANGMATCHES().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
            builtInCall.add("expression", visit(ctx.expression(1)));
        } else if (ctx.DATATYPE() != null) {
            builtInCall.add("builtInFunction", ctx.DATATYPE().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.BOUND() != null) {
            builtInCall.add("builtInFunction", ctx.BOUND().getSymbol().getText().toUpperCase());
            builtInCall.add("var", visitVar((SparqlParser.VarContext) ctx.var()));
        } else if (ctx.IRI() != null) {
            builtInCall.add("builtInFunction", ctx.IRI().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.URI() != null) {
            builtInCall.add("builtInFunction", ctx.URI().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.BNODE() != null) {
            builtInCall.add("builtInFunction", ctx.BNODE().getSymbol().getText().toUpperCase());
            if (ctx.expression(0) != null) {
                builtInCall.add("expression", visit(ctx.expression(0)));
            }
        } else if (ctx.RAND() != null) {
            builtInCall.add("builtInFunction", ctx.RAND().getSymbol().getText().toUpperCase());
        } else if (ctx.ABS() != null) {
            builtInCall.add("builtInFunction", ctx.ABS().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.CEIL() != null) {
            builtInCall.add("builtInFunction", ctx.CEIL().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.FLOOR() != null) {
            builtInCall.add("builtInFunction", ctx.FLOOR().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.ROUND() != null) {
            builtInCall.add("builtInFunction", ctx.ROUND().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.CONCAT() != null) {
            builtInCall.add("builtInFunction", ctx.CONCAT().getSymbol().getText().toUpperCase());
            if (ctx.expressionList() != null) {
                builtInCall.add("expressionList", visitExpressionList(ctx.expressionList()));
            }
        } else if (ctx.STRLEN() != null) {
            builtInCall.add("builtInFunction", ctx.STRLEN().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.UCASE() != null) {
            builtInCall.add("builtInFunction", ctx.UCASE().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.LCASE() != null) {
            builtInCall.add("builtInFunction", ctx.LCASE().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.ENCODE_FOR_URI() != null) {
            builtInCall.add("builtInFunction", ctx.ENCODE_FOR_URI().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.CONTAINS() != null) {
            builtInCall.add("builtInFunction", ctx.CONTAINS().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
            builtInCall.add("expression", visit(ctx.expression(1)));
        } else if (ctx.STRSTARTS() != null) {
            builtInCall.add("builtInFunction", ctx.STRSTARTS().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
            builtInCall.add("expression", visit(ctx.expression(1)));
        } else if (ctx.STRENDS() != null) {
            builtInCall.add("builtInFunction", ctx.STRENDS().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
            builtInCall.add("expression", visit(ctx.expression(1)));
        } else if (ctx.STRBEFORE() != null) {
            builtInCall.add("builtInFunction", ctx.STRBEFORE().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
            builtInCall.add("expression", visit(ctx.expression(1)));
        } else if (ctx.STRAFTER() != null) {
            builtInCall.add("builtInFunction", ctx.STRAFTER().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
            builtInCall.add("expression", visit(ctx.expression(1)));
        } else if (ctx.YEAR() != null) {
            builtInCall.add("builtInFunction", ctx.YEAR().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.MONTH() != null) {
            builtInCall.add("builtInFunction", ctx.MONTH().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.DAY() != null) {
            builtInCall.add("builtInFunction", ctx.DAY().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.HOURS() != null) {
            builtInCall.add("builtInFunction", ctx.HOURS().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.MINUTES() != null) {
            builtInCall.add("builtInFunction", ctx.MINUTES().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.SECONDS() != null) {
            builtInCall.add("builtInFunction", ctx.SECONDS().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.TIMEZONE() != null) {
            builtInCall.add("builtInFunction", ctx.TIMEZONE().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.TZ() != null) {
            builtInCall.add("builtInFunction", ctx.TZ().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.NOW() != null) {
            builtInCall.add("builtInFunction", ctx.NOW().getSymbol().getText().toUpperCase());
        } else if (ctx.UUID() != null) {
            builtInCall.add("builtInFunction", ctx.UUID().getSymbol().getText().toUpperCase());
        } else if (ctx.STRUUID() != null) {
            builtInCall.add("builtInFunction", ctx.STRUUID().getSymbol().getText().toUpperCase());
        } else if (ctx.MD5() != null) {
            builtInCall.add("builtInFunction", ctx.MD5().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.SHA1() != null) {
            builtInCall.add("builtInFunction", ctx.SHA1().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.SHA256() != null) {
            builtInCall.add("builtInFunction", ctx.SHA256().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.SHA384() != null) {
            builtInCall.add("builtInFunction", ctx.SHA384().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.SHA512() != null) {
            builtInCall.add("builtInFunction", ctx.SHA512().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.COALESCE() != null) {
            builtInCall.add("builtInFunction", ctx.COALESCE().getSymbol().getText().toUpperCase());
            if (ctx.expressionList() != null) {
                builtInCall.add("expressionList", visitExpressionList(ctx.expressionList()));
            }
        } else if (ctx.IF() != null) {
            builtInCall.add("builtInFunction", ctx.IF().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
            builtInCall.add("expression", visit(ctx.expression(1)));
            builtInCall.add("expression", visit(ctx.expression(2)));
        } else if (ctx.STRLANG() != null) {
            builtInCall.add("builtInFunction", ctx.STRLANG().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
            builtInCall.add("expression", visit(ctx.expression(1)));
        } else if (ctx.STRDT() != null) {
            builtInCall.add("builtInFunction", ctx.STRDT().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
            builtInCall.add("expression", visit(ctx.expression(1)));
        } else if (ctx.SAMETERM() != null) {
            builtInCall.add("builtInFunction", ctx.SAMETERM().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
            builtInCall.add("expression", visit(ctx.expression(1)));
        } else if (ctx.ISIRI() != null) {
            builtInCall.add("builtInFunction", ctx.ISIRI().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.ISURI() != null) {
            builtInCall.add("builtInFunction", ctx.ISURI().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.ISBLANK() != null) {
            builtInCall.add("builtInFunction", ctx.ISBLANK().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.ISLITERAL() != null) {
            builtInCall.add("builtInFunction", ctx.ISLITERAL().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.ISNUMERIC() != null) {
            builtInCall.add("builtInFunction", ctx.ISNUMERIC().getSymbol().getText().toUpperCase());
            builtInCall.add("expression", visit(ctx.expression(0)));
        } else if (ctx.subStringExpression() != null) {
            builtInCall.add("subStringExpression", visitSubStringExpression(ctx.subStringExpression()));
        } else if (ctx.strReplaceExpression() != null) {
            builtInCall.add("strReplaceExpression", visitStrReplaceExpression(ctx.strReplaceExpression()));
        } else if (ctx.regexExpression() != null) {
            builtInCall.add("regexExpression", visitRegexExpression(ctx.regexExpression()));
        } else if (ctx.existsFunction() != null) {
            builtInCall.add("existsFunction", visitExistsFunction(ctx.existsFunction()));
        } else if (ctx.notExistsFunction() != null) {
            builtInCall.add("notExistsFunction", visitNotExistsFunction(ctx.notExistsFunction()));
        }

        return builtInCall;
    }

    @Override
    public ST visitRegexExpression(SparqlParser.RegexExpressionContext ctx) {
        // regexExpression :
        //   REGEX OPEN_BRACE expression COMMA expression (COMMA expression)? CLOSE_BRACE

        ST regexExpression = g.getInstanceOf("regexExpression");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.ExpressionContext) {
                regexExpression.add("expression", visit((SparqlParser.ExpressionContext) c));
            }
        }

        return regexExpression;
    }

    @Override
    public ST visitSubStringExpression(SparqlParser.SubStringExpressionContext ctx) {
        // subStringExpression :
        //   SUBSTR OPEN_BRACE expression COMMA expression (COMMA expression)? CLOSE_BRACE

        ST subStringExpression = g.getInstanceOf("subStringExpression");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.ExpressionContext) {
                subStringExpression.add("expression", visit((SparqlParser.ExpressionContext) c));
            }
        }

        return subStringExpression;
    }

    @Override
    public ST visitStrReplaceExpression(SparqlParser.StrReplaceExpressionContext ctx) {
        // strReplaceExpression :
        //   REPLACE OPEN_BRACE expression COMMA expression COMMA expression (COMMA expression)? CLOSE_BRACE

        ST strReplaceExpression = g.getInstanceOf("strReplaceExpression");

        for (ParseTree c : ctx.children) {
            if (c instanceof SparqlParser.ExpressionContext) {
                strReplaceExpression.add("expression", visit((SparqlParser.ExpressionContext) c));
            }
        }

        return strReplaceExpression;
    }

    @Override
    public ST visitExistsFunction(SparqlParser.ExistsFunctionContext ctx) {
        // existsFunction :
        //   EXISTS groupGraphPattern

        ST existsFunction = g.getInstanceOf("existsFunction");

        existsFunction.add("groupGraphPattern", visitGroupGraphPattern(ctx.groupGraphPattern()));

        return existsFunction;
    }

    @Override
    public ST visitNotExistsFunction(SparqlParser.NotExistsFunctionContext ctx) {
        // notExistsFunction :
        //   NOT EXISTS groupGraphPattern

        ST notExistsFunction = g.getInstanceOf("notExistsFunction");

        notExistsFunction.add("groupGraphPattern", visitGroupGraphPattern(ctx.groupGraphPattern()));

        return notExistsFunction;
    }

    @Override
    public ST visitAggregate(SparqlParser.AggregateContext ctx) {
        // aggregate :
        //    COUNT OPEN_BRACE DISTINCT? (ASTERISK | expression) CLOSE_BRACE
        //  | SUM OPEN_BRACE DISTINCT? expression CLOSE_BRACE
        //  | MIN OPEN_BRACE DISTINCT? expression CLOSE_BRACE
        //  | MAX OPEN_BRACE DISTINCT? expression CLOSE_BRACE
        //  | AVG OPEN_BRACE DISTINCT? expression CLOSE_BRACE
        //  | SAMPLE OPEN_BRACE DISTINCT? expression CLOSE_BRACE
        //  | GROUP_CONCAT OPEN_BRACE DISTINCT? expression (SEMICOLON SEPARATOR EQUAL string)? CLOSE_BRACE

        ST aggregate = g.getInstanceOf("aggregate");

        if (ctx.COUNT() != null) {
            aggregate.add("operation", ctx.COUNT().getSymbol().getText().toUpperCase());
            if (ctx.DISTINCT() != null) {
                aggregate.add("attribute", ctx.DISTINCT().getSymbol().getText().toUpperCase());
            }
            if (ctx.ASTERISK() != null) {
                aggregate.add("whatever", ctx.ASTERISK().getSymbol().getText());
            } else if (ctx.expression() != null) {
                aggregate.add("expression", visit(ctx.expression()));
            }
        } else if (ctx.SUM() != null) {
            aggregate.add("operation", ctx.SUM().getSymbol().getText().toUpperCase());
            if (ctx.DISTINCT() != null) {
                aggregate.add("attribute", ctx.DISTINCT().getSymbol().getText().toUpperCase());
            }
            aggregate.add("expression", visit(ctx.expression()));
        } else if (ctx.MIN() != null) {
            aggregate.add("operation", ctx.MIN().getSymbol().getText().toUpperCase());
            if (ctx.DISTINCT() != null) {
                aggregate.add("attribute", ctx.DISTINCT().getSymbol().getText().toUpperCase());
            }
            aggregate.add("expression", visit(ctx.expression()));
        } else if (ctx.MAX() != null) {
            aggregate.add("operation", ctx.MAX().getSymbol().getText().toUpperCase());
            if (ctx.DISTINCT() != null) {
                aggregate.add("attribute", ctx.DISTINCT().getSymbol().getText().toUpperCase());
            }
            aggregate.add("expression", visit(ctx.expression()));
        } else if (ctx.AVG() != null) {
            aggregate.add("operation", ctx.AVG().getSymbol().getText().toUpperCase());
            if (ctx.DISTINCT() != null) {
                aggregate.add("attribute", ctx.DISTINCT().getSymbol().getText().toUpperCase());
            }
            aggregate.add("expression", visit(ctx.expression()));
        } else if (ctx.SAMPLE() != null) {
            aggregate.add("operation", ctx.SAMPLE().getSymbol().getText().toUpperCase());
            if (ctx.DISTINCT() != null) {
                aggregate.add("attribute", ctx.DISTINCT().getSymbol().getText().toUpperCase());
            }
            aggregate.add("expression", visit(ctx.expression()));
        } else if (ctx.GROUP_CONCAT() != null) {
            aggregate.add("operation", ctx.GROUP_CONCAT().getSymbol().getText().toUpperCase());
            if (ctx.DISTINCT() != null) {
                aggregate.add("attribute", ctx.DISTINCT().getSymbol().getText().toUpperCase());
            }
            aggregate.add("expression", visit(ctx.expression()));
            if (ctx.string() != null) {
                aggregate.add("string", visitString(ctx.string()));
            }
        }

        return aggregate;
    }

    @Override
    public ST visitIriRefOrFunction(SparqlParser.IriRefOrFunctionContext ctx) {
        // iriRefOrFunction :
        //   iri argList?

        ST iriRefOrFunction = g.getInstanceOf("iriRefOrFunction");

        iriRefOrFunction.add("iri", visitIri(ctx.iri()));

        if (ctx.argList() != null) {
            iriRefOrFunction.add("argList", visitArgList(ctx.argList()));
        }

        return iriRefOrFunction;
    }

    @Override
    public ST visitRdfLiteral(SparqlParser.RdfLiteralContext ctx) {
        // rdfLiteral :
        //   string (LANGTAG | (REFERENCE iri))?

        ST rdfLiteral = g.getInstanceOf("rdfLiteral");

        rdfLiteral.add("string", visitString(ctx.string()));

        if (ctx.LANGTAG() != null) {
            rdfLiteral.add("langTag", ctx.LANGTAG().getSymbol().getText());
        } else if (ctx.iri() != null) {
            rdfLiteral.add("iri", visitIri(ctx.iri()));
        }

        return rdfLiteral;
    }

    @Override
    public ST visitNumericLiteral(SparqlParser.NumericLiteralContext ctx) {
        // numericLiteral :
        //   numericLiteralUnsigned | numericLiteralPositive | numericLiteralNegative

        ST numericLiteral = g.getInstanceOf("numericLiteral");

        if (ctx.numericLiteralUnsigned() != null) {
            numericLiteral.add("numericLiteralUnsigned", visitNumericLiteralUnsigned(ctx.numericLiteralUnsigned()));
        } else if (ctx.numericLiteralPositive() != null) {
            numericLiteral.add("numericLiteralPositive", visitNumericLiteralPositive(ctx.numericLiteralPositive()));
        } else if (ctx.numericLiteralNegative() != null) {
            numericLiteral.add("numericLiteralPositive", visitNumericLiteralNegative(ctx.numericLiteralNegative()));
        }

        return numericLiteral;
    }

    @Override
    public ST visitNumericLiteralUnsigned(SparqlParser.NumericLiteralUnsignedContext ctx) {
        // numericLiteralUnsigned :
        //  INTEGER | DECIMAL | DOUBLE

        ST numericLiteralUnsigned = g.getInstanceOf("numericLiteralUnsigned");

        if (ctx.INTEGER() != null) {
            numericLiteralUnsigned.add("value", ctx.INTEGER().getSymbol().getText());
        } else if (ctx.DECIMAL() != null) {
            numericLiteralUnsigned.add("value", ctx.DECIMAL().getSymbol().getText());
        } else if (ctx.DOUBLE() != null) {
            numericLiteralUnsigned.add("value", ctx.DOUBLE().getSymbol().getText());
        }

        return numericLiteralUnsigned;
    }

    @Override
    public ST visitNumericLiteralPositive(SparqlParser.NumericLiteralPositiveContext ctx) {
        // numericLiteralPositive :
        //   INTEGER_POSITIVE | DECIMAL_POSITIVE | DOUBLE_POSITIVE

        ST numericLiteralPositive = g.getInstanceOf("numericLiteralPositive");

        if (ctx.INTEGER_POSITIVE() != null) {
            numericLiteralPositive.add("value", ctx.INTEGER_POSITIVE().getSymbol().getText());
        } else if (ctx.DECIMAL_POSITIVE() != null) {
            numericLiteralPositive.add("value", ctx.DECIMAL_POSITIVE().getSymbol().getText());
        } else if (ctx.DOUBLE_POSITIVE() != null) {
            numericLiteralPositive.add("value", ctx.DOUBLE_POSITIVE().getSymbol().getText());
        }

        return numericLiteralPositive;
    }

    @Override
    public ST visitNumericLiteralNegative(SparqlParser.NumericLiteralNegativeContext ctx) {
        // numericLiteralNegative :
        //   INTEGER_NEGATIVE | DECIMAL_NEGATIVE | DOUBLE_NEGATIVE

        ST numericLiteralNegative = g.getInstanceOf("numericLiteralNegative");

        if (ctx.INTEGER_NEGATIVE() != null) {
            numericLiteralNegative.add("value", ctx.INTEGER_NEGATIVE().getSymbol().getText());
        } else if (ctx.DECIMAL_NEGATIVE() != null) {
            numericLiteralNegative.add("value", ctx.DECIMAL_NEGATIVE().getSymbol().getText());
        } else if (ctx.DOUBLE_NEGATIVE() != null) {
            numericLiteralNegative.add("value", ctx.DOUBLE_NEGATIVE().getSymbol().getText());
        }

        return numericLiteralNegative;
    }

    @Override
    public ST visitBooleanLiteral(SparqlParser.BooleanLiteralContext ctx) {
        // booleanLiteral :
        //   TRUE | FALSE

        ST booleanLiteral = g.getInstanceOf("booleanLiteral");

        if (ctx.TRUE() != null) {
            booleanLiteral.add("value", ctx.TRUE().getSymbol().getText().toUpperCase());
        } else if (ctx.FALSE() != null) {
            booleanLiteral.add("value", ctx.FALSE().getSymbol().getText().toUpperCase());
        }

        return booleanLiteral;
    }

    @Override
    public ST visitString(SparqlParser.StringContext ctx) {
        // string :
        //   STRING_LITERAL1 | STRING_LITERAL2 | STRING_LITERAL_LONG1 | STRING_LITERAL_LONG2

        ST string = g.getInstanceOf("string");

        if (ctx.STRING_LITERAL1() != null) {
            string.add("value", ctx.STRING_LITERAL1().getSymbol().getText());
        } else if (ctx.STRING_LITERAL2() != null) {
            string.add("value", ctx.STRING_LITERAL2().getSymbol().getText());
        } else if (ctx.STRING_LITERAL_LONG1() != null) {
            string.add("value", ctx.STRING_LITERAL_LONG1().getSymbol().getText());
        } else if (ctx.STRING_LITERAL_LONG2() != null) {
            string.add("value", ctx.STRING_LITERAL_LONG2().getSymbol().getText());
        }

        return string;
    }

    @Override
    public ST visitIri(SparqlParser.IriContext ctx) {
        // iri :
        //   IRIREF | prefixedName

        ST iri = g.getInstanceOf("iri");

        if (ctx.IRIREF() != null) {
            String s = ctx.IRIREF().getSymbol().getText();
            iri.add("IRIREF", s.substring(1, s.length() - 1));
        } else if (ctx.prefixedName() != null) {
            iri.add("prefixedName", visitPrefixedName(ctx.prefixedName()));
        }

        return iri;
    }

    @Override
    public ST visitPrefixedName(SparqlParser.PrefixedNameContext ctx) {
        // prefixedName :
        //   PNAME_LN | PNAME_NS

        ST prefixedName = g.getInstanceOf("prefixedName");

        if (ctx.PNAME_LN() != null) {
            prefixedName.add("value", ctx.PNAME_LN().getSymbol().getText());
        } else if (ctx.PNAME_NS() != null) {
            prefixedName.add("value", ctx.PNAME_NS().getSymbol().getText());
        }

        return prefixedName;
    }

    @Override
    public ST visitBlankNode(SparqlParser.BlankNodeContext ctx) {
        // blankNode :
        //   BLANK_NODE_LABEL | anon

        ST blankNode = g.getInstanceOf("blankNode");

        if (ctx.BLANK_NODE_LABEL() != null) {
            blankNode.add("value", ctx.BLANK_NODE_LABEL().getSymbol().getText());
        } else if (ctx.anon() != null) {
            blankNode.add("anon", visitAnon(ctx.anon()));
        }

        return blankNode;
    }

    @Override
    public ST visitAnon(SparqlParser.AnonContext ctx) {
        // anon :
        //   OPEN_SQUARE_BRACKET CLOSE_SQUARE_BRACKET

        ST anon = g.getInstanceOf("anon");

        return anon;
    }
}