in src/main/java/com/uber/uberscriptquery/antlr4/parsing/QueryTemplateParser.java [37:103]
public QueryTemplateParseResult parse(String text, Map<String, Object> variableOverwrite) {
final char[] charArray = text.toCharArray();
final char[] charArrayUpperCase = text.toUpperCase().toCharArray();
final QueryTemplateParseResult parsedResult = new QueryTemplateParseResult();
UberScriptQueryTemplateLexer l = new UberScriptQueryTemplateLexer(new ANTLRInputStream(charArrayUpperCase, charArrayUpperCase.length));
com.uber.uberscriptquery.antlr4.generated.UberScriptQueryTemplateParser p = new com.uber.uberscriptquery.antlr4.generated.UberScriptQueryTemplateParser(new CommonTokenStream(l));
p.addErrorListener(new BaseErrorListener() {
@Override
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
throw new IllegalStateException(
String.format("Failed to parse at line %s char %s due to %s", line, charPositionInLine, msg),
e);
}
});
final AtomicInteger lastOffset = new AtomicInteger(-1);
final Map<String, Object> variableMap = new HashMap<>();
if (variableOverwrite != null && !variableOverwrite.isEmpty()) {
variableMap.putAll(variableOverwrite);
}
p.addParseListener(
new UberScriptQueryTemplateBaseListener() {
@Override
public void exitVariableAssignment(com.uber.uberscriptquery.antlr4.generated.UberScriptQueryTemplateParser.VariableAssignmentContext ctx) {
lastOffset.set(ctx.getStop().getStopIndex());
String variableName = getMatchedString(ctx.variableAssignment_variableName(), charArray);
if (variableOverwrite != null && variableOverwrite.containsKey(variableName)) {
logger.info(String.format("Ignored variable %s because of variable overwrite with value %s", variableName, variableOverwrite.get(variableName)));
return;
}
String variableValue = getMatchedString(ctx.STRING().getSymbol(), charArray);
if (variableValue == null) {
return;
}
variableValue = ParserUtils.getStringStatementInnerValue(variableValue);
variableValue = TemplateUtils.transform(variableValue, variableMap);
variableMap.put(variableName, variableValue);
}
@Override
public void exitAssignmentWithSemicolon(com.uber.uberscriptquery.antlr4.generated.UberScriptQueryTemplateParser.AssignmentWithSemicolonContext ctx) {
lastOffset.set(ctx.getStop().getStopIndex());
}
});
p.root();
parsedResult.setVariableMap(variableMap);
String templateBody = new String(charArray, lastOffset.get() + 1, charArray.length - lastOffset.get() - 1);
templateBody = TemplateUtils.transform(templateBody, variableMap);
parsedResult.setTemplateBody(templateBody);
return parsedResult;
}