blob: 27caa3dfc61a3e2fd7c858f1e6bf08b5179c48e9 [file] [log] [blame]
package de.ids_mannheim.korap.query.serialize;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.BailErrorStrategy;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.Lexer;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.tree.ParseTree;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//TODO replace AqlLexer with lexer for your Antlr4 grammar!
import de.ids_mannheim.korap.query.parse.annis.AqlLexer;
//TODO replace AqlParser with parser for your Antlr4 grammar!
import de.ids_mannheim.korap.query.parse.annis.AqlParser;
import de.ids_mannheim.korap.query.serialize.util.KoralObjectGenerator;
import de.ids_mannheim.korap.query.serialize.util.StatusCodes;
/**
* Map representation of syntax tree as returned by ANTLR
* @author Joachim Bingel (bingel@ids-mannheim.de)
*
*/
public class TreeTemplate extends Antlr4AbstractQueryProcessor {
private static Logger log = LoggerFactory.getLogger(TreeTemplate.class);
/**
*
* @param tree The syntax tree as returned by ANTLR
* @param parser The ANTLR parser instance that generated the parse tree
*/
public TreeTemplate(String query) {
KoralObjectGenerator.setQueryProcessor(this);
process(query);
}
@Override
public void process(String query) {
ParseTree tree = parseQuery(query);
super.parser = this.parser;
if (tree != null) {
log.debug("ANTLR parse tree: "+tree.toStringTree(parser));
processNode(tree);
} else {
addError(StatusCodes.MALFORMED_QUERY, "Could not parse query >>> "+query+" <<<.");
}
}
private void processNode(ParseTree node) {
// Top-down processing
if (visited.contains(node)) return;
else visited.add(node);
String nodeCat = getNodeCat(node);
openNodeCats.push(nodeCat);
stackedObjects = 0;
if (verbose) {
System.err.println(" "+objectStack);
System.out.println(openNodeCats);
}
/*
****************************************************************
****************************************************************
* Processing individual node categories *
****************************************************************
****************************************************************
*/
objectsToPop.push(stackedObjects);
/*
****************************************************************
****************************************************************
* recursion until 'request' node (root of tree) is processed *
****************************************************************
****************************************************************
*/
for (int i=0; i<node.getChildCount(); i++) {
ParseTree child = node.getChild(i);
processNode(child);
}
/*
**************************************************************
* Stuff that happens after processing the children of a node *
**************************************************************
*/
for (int i=0; i<objectsToPop.pop(); i++) {
objectStack.pop();
}
openNodeCats.pop();
}
@SuppressWarnings("unused")
private void putIntoSuperObject(LinkedHashMap<String, Object> object) {
putIntoSuperObject(object, 0);
}
@SuppressWarnings({ "unchecked" })
private void putIntoSuperObject(LinkedHashMap<String, Object> object, int objStackPosition) {
if (objectStack.size()>objStackPosition) {
ArrayList<Object> topObjectOperands = (ArrayList<Object>) objectStack.get(objStackPosition).get("operands");
topObjectOperands.add(0, object);
} else {
requestMap.put("query", object);
}
}
private ParserRuleContext parseQuery (String q) {
//TODO replace AqlLexer with lexer for your Antlr4 grammar!
Lexer qlLexer = new AqlLexer((CharStream)null);
ParserRuleContext tree = null;
// Like p. 111
try {
// Tokenize input data
ANTLRInputStream input = new ANTLRInputStream(q);
qlLexer.setInputStream(input);
CommonTokenStream tokens = new CommonTokenStream(qlLexer);
//TODO replace AqlParser with parser for your Antlr4 grammar!
parser = new AqlParser(tokens);
// Don't throw out erroneous stuff
parser.setErrorHandler(new BailErrorStrategy());
parser.removeErrorListeners();
// Get starting rule from parser
//TODO replace AqlParser with parser for your Antlr4 grammar!
Method startRule = AqlParser.class.getMethod("start");
tree = (ParserRuleContext) startRule.invoke(parser, (Object[])null);
}
// Some things went wrong ...
catch (Exception e) {
System.err.println( e.getMessage() );
}
// Return the generated tree
return tree;
}
}