All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.weaverplatform.sp4rql.parser.Sp4rqlParser Maven / Gradle / Ivy

package com.weaverplatform.sp4rql.parser;

import com.weaverplatform.sp4rql.error.NotSupportedException;
import com.weaverplatform.sp4rql.error.ParseException;
import com.weaverplatform.sp4rql.model.scope.ScopeQuery;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.misc.ParseCancellationException;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
import sp4rql.Sp4rql11Lexer;
import sp4rql.Sp4rql11Parser;

public class Sp4rqlParser {

  private static BaseErrorListener errorListener = new BaseErrorListener() {
    @Override
    public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) throws ParseCancellationException {
      throw new ParseCancellationException("line " + line + ":" + charPositionInLine + " " + msg);
    }
  };

  private static Sp4rql11Parser getParser(String query) {
    Sp4rql11Lexer lexer = new Sp4rql11Lexer(CharStreams.fromString(query));
    lexer.removeErrorListeners();
    lexer.addErrorListener(errorListener);
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    Sp4rql11Parser parser = new Sp4rql11Parser(tokens);
    parser.removeErrorListeners();
    parser.addErrorListener(errorListener);
    return parser;
  }

  public static ScopeQuery parseQuery(String query) throws ParseException, NotSupportedException {
    try {
      Sp4rql11Parser parser = getParser(query);
      Sp4rql11Parser.QueryUnitContext context = parser.queryUnit();
      QueryUnitListener listener = new QueryUnitListener();
      ParseTreeWalker.DEFAULT.walk(listener, context);
      listener.finish();
      return listener.getUnit();
    } catch(ParseCancellationException e) {
      throw new ParseException(String.format("Failed parsing the Sp4rql query: %s", e.getMessage()));
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy