blob: 7cc81748fe4d80955d3f63c8bfadca64c5e875f2 [file] [log] [blame]
Joachim Bingelc8a28e42014-04-24 15:06:42 +00001package de.ids_mannheim.korap.query.serialize;
2
3import java.lang.reflect.Method;
4import java.util.ArrayList;
Joachim Bingelc8a28e42014-04-24 15:06:42 +00005import java.util.LinkedHashMap;
Joachim Bingelc8a28e42014-04-24 15:06:42 +00006
7import org.antlr.v4.runtime.ANTLRInputStream;
8import org.antlr.v4.runtime.BailErrorStrategy;
9import org.antlr.v4.runtime.CharStream;
10import org.antlr.v4.runtime.CommonTokenStream;
11import org.antlr.v4.runtime.Lexer;
Joachim Bingelc8a28e42014-04-24 15:06:42 +000012import org.antlr.v4.runtime.ParserRuleContext;
13import org.antlr.v4.runtime.tree.ParseTree;
Joachim Bingel3d5b69b2015-01-14 10:46:44 +000014import org.slf4j.Logger;
15import org.slf4j.LoggerFactory;
Joachim Bingelc8a28e42014-04-24 15:06:42 +000016
Joachim Bingel3d5b69b2015-01-14 10:46:44 +000017//TODO replace AqlLexer with lexer for your Antlr4 grammar!
Joachim Bingel6003b852014-12-18 14:20:55 +000018import de.ids_mannheim.korap.query.parse.annis.AqlLexer;
Joachim Bingel3d5b69b2015-01-14 10:46:44 +000019//TODO replace AqlParser with parser for your Antlr4 grammar!
Joachim Bingel6003b852014-12-18 14:20:55 +000020import de.ids_mannheim.korap.query.parse.annis.AqlParser;
Joachim Bingelaa4ab2f2015-01-16 14:26:51 +000021import de.ids_mannheim.korap.query.serialize.util.KoralObjectGenerator;
Joachim Bingel3d5b69b2015-01-14 10:46:44 +000022import de.ids_mannheim.korap.query.serialize.util.StatusCodes;
Joachim Bingelc8a28e42014-04-24 15:06:42 +000023
24/**
25 * Map representation of syntax tree as returned by ANTLR
Joachim Bingel3d5b69b2015-01-14 10:46:44 +000026 * @author Joachim Bingel (bingel@ids-mannheim.de)
Joachim Bingel7cb346e2015-03-09 10:56:20 +010027 * @version 0.3.0
28 * @since 0.1.0
Joachim Bingelc8a28e42014-04-24 15:06:42 +000029 */
Joachim Bingel1faf8a52015-01-09 13:17:34 +000030public class TreeTemplate extends Antlr4AbstractQueryProcessor {
Joachim Bingel3d5b69b2015-01-14 10:46:44 +000031 private static Logger log = LoggerFactory.getLogger(TreeTemplate.class);
Joachim Bingelc8a28e42014-04-24 15:06:42 +000032 /**
33 *
34 * @param tree The syntax tree as returned by ANTLR
35 * @param parser The ANTLR parser instance that generated the parse tree
36 */
37 public TreeTemplate(String query) {
Joachim Bingelaa4ab2f2015-01-16 14:26:51 +000038 KoralObjectGenerator.setQueryProcessor(this);
Joachim Bingel3d5b69b2015-01-14 10:46:44 +000039 process(query);
40 }
41
42 @Override
43 public void process(String query) {
44 ParseTree tree = parseQuery(query);
45 super.parser = this.parser;
46 if (tree != null) {
47 log.debug("ANTLR parse tree: "+tree.toStringTree(parser));
48 processNode(tree);
49 } else {
50 addError(StatusCodes.MALFORMED_QUERY, "Could not parse query >>> "+query+" <<<.");
Joachim Bingelc8a28e42014-04-24 15:06:42 +000051 }
Joachim Bingelc8a28e42014-04-24 15:06:42 +000052 }
Joachim Bingel3d5b69b2015-01-14 10:46:44 +000053
Joachim Bingelc8a28e42014-04-24 15:06:42 +000054 private void processNode(ParseTree node) {
55 // Top-down processing
56 if (visited.contains(node)) return;
57 else visited.add(node);
Joachim Bingel3d5b69b2015-01-14 10:46:44 +000058
Joachim Bingelc8a28e42014-04-24 15:06:42 +000059 String nodeCat = getNodeCat(node);
60 openNodeCats.push(nodeCat);
Joachim Bingel3d5b69b2015-01-14 10:46:44 +000061
Joachim Bingelc8a28e42014-04-24 15:06:42 +000062 stackedObjects = 0;
Joachim Bingel3d5b69b2015-01-14 10:46:44 +000063
Joachim Bingelc8a28e42014-04-24 15:06:42 +000064 if (verbose) {
65 System.err.println(" "+objectStack);
66 System.out.println(openNodeCats);
67 }
68
69 /*
70 ****************************************************************
71 ****************************************************************
72 * Processing individual node categories *
73 ****************************************************************
74 ****************************************************************
75 */
76
77 objectsToPop.push(stackedObjects);
Joachim Bingel3d5b69b2015-01-14 10:46:44 +000078
Joachim Bingelc8a28e42014-04-24 15:06:42 +000079 /*
80 ****************************************************************
81 ****************************************************************
82 * recursion until 'request' node (root of tree) is processed *
83 ****************************************************************
84 ****************************************************************
85 */
86 for (int i=0; i<node.getChildCount(); i++) {
87 ParseTree child = node.getChild(i);
88 processNode(child);
89 }
Joachim Bingel3d5b69b2015-01-14 10:46:44 +000090
91
Joachim Bingelc8a28e42014-04-24 15:06:42 +000092 /*
93 **************************************************************
94 * Stuff that happens after processing the children of a node *
95 **************************************************************
96 */
Joachim Bingel3d5b69b2015-01-14 10:46:44 +000097
98
Joachim Bingelc8a28e42014-04-24 15:06:42 +000099 for (int i=0; i<objectsToPop.pop(); i++) {
100 objectStack.pop();
101 }
Joachim Bingel3d5b69b2015-01-14 10:46:44 +0000102
Joachim Bingelc8a28e42014-04-24 15:06:42 +0000103
104 openNodeCats.pop();
Joachim Bingel3d5b69b2015-01-14 10:46:44 +0000105
Joachim Bingelc8a28e42014-04-24 15:06:42 +0000106 }
107
Joachim Bingelc8a28e42014-04-24 15:06:42 +0000108 @SuppressWarnings("unused")
109 private void putIntoSuperObject(LinkedHashMap<String, Object> object) {
110 putIntoSuperObject(object, 0);
111 }
Joachim Bingel3d5b69b2015-01-14 10:46:44 +0000112
Joachim Bingelc8a28e42014-04-24 15:06:42 +0000113 @SuppressWarnings({ "unchecked" })
114 private void putIntoSuperObject(LinkedHashMap<String, Object> object, int objStackPosition) {
Joachim Bingel3d5b69b2015-01-14 10:46:44 +0000115 if (objectStack.size()>objStackPosition) {
Joachim Bingelc8a28e42014-04-24 15:06:42 +0000116 ArrayList<Object> topObjectOperands = (ArrayList<Object>) objectStack.get(objStackPosition).get("operands");
117 topObjectOperands.add(0, object);
Joachim Bingel3d5b69b2015-01-14 10:46:44 +0000118
Joachim Bingelc8a28e42014-04-24 15:06:42 +0000119 } else {
120 requestMap.put("query", object);
121 }
122 }
Joachim Bingelc8a28e42014-04-24 15:06:42 +0000123
Joachim Bingel3d5b69b2015-01-14 10:46:44 +0000124 private ParserRuleContext parseQuery (String q) {
125 //TODO replace AqlLexer with lexer for your Antlr4 grammar!
126 Lexer qlLexer = new AqlLexer((CharStream)null);
127 ParserRuleContext tree = null;
128 // Like p. 111
129 try {
130 // Tokenize input data
131 ANTLRInputStream input = new ANTLRInputStream(q);
132 qlLexer.setInputStream(input);
133 CommonTokenStream tokens = new CommonTokenStream(qlLexer);
134 //TODO replace AqlParser with parser for your Antlr4 grammar!
135 parser = new AqlParser(tokens);
Joachim Bingelc8a28e42014-04-24 15:06:42 +0000136
Joachim Bingel3d5b69b2015-01-14 10:46:44 +0000137 // Don't throw out erroneous stuff
138 parser.setErrorHandler(new BailErrorStrategy());
139 parser.removeErrorListeners();
Joachim Bingelc8a28e42014-04-24 15:06:42 +0000140
Joachim Bingel3d5b69b2015-01-14 10:46:44 +0000141 // Get starting rule from parser
142 //TODO replace AqlParser with parser for your Antlr4 grammar!
143 Method startRule = AqlParser.class.getMethod("start");
144 tree = (ParserRuleContext) startRule.invoke(parser, (Object[])null);
145 }
Joachim Bingelc8a28e42014-04-24 15:06:42 +0000146
Joachim Bingel3d5b69b2015-01-14 10:46:44 +0000147 // Some things went wrong ...
148 catch (Exception e) {
149 System.err.println( e.getMessage() );
150 }
Joachim Bingelc8a28e42014-04-24 15:06:42 +0000151
Joachim Bingel3d5b69b2015-01-14 10:46:44 +0000152 // Return the generated tree
153 return tree;
154 }
Joachim Bingelc8a28e42014-04-24 15:06:42 +0000155}