package org.apache.lucene.queryparser.flexible.aqp.parser;
import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;
import java.lang.reflect.*;
/**
* A utility class for generating the dot/graph representations of the query
*
*
*/
// import
// org.apache.lucene.queryparser.flexible.aqp.parser.StandardLuceneGrammarLexer;
// import
// org.apache.lucene.queryparser.flexible.aqp.parser.StandardLuceneGrammarParser;
/*
* Arguments: - grammar - query - rule-name (optional, default "mainQ") - action
* (optional, default: dot)
*/
public class BuildAST {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception {
String grammar = args[0];
String ruleName = "mainQ";
String action = "dot";
if (args.length > 2) {
ruleName = args[2];
}
if (args.length > 3) {
if (args[3].toLowerCase().equals("dot")) {
action = "dot";
} else if (args[3].toLowerCase().equals("tree")) {
action = "tree";
} else {
throw new Exception("Unknown argument " + args[3]
+ ". Allowed actions: dot,tree");
}
}
System.err.println("Grammar: " + grammar + " rule:" + ruleName
+ "\nquery: " + (args.length > 1 ? args[1] : "--"));
String input = args.length > 1 ? args[1] : "No input given";
ANTLRStringStream in = new ANTLRStringStream(input);
// Lexer lexer = new StandardLuceneGrammarLexer(in);
// CommonTokenStream ts = new CommonTokenStream(lexer);
// System.err.println(ts.toString());
// CommonTokenStream tokens = new CommonTokenStream(lexer);
// StandardLuceneGrammarParser parser = new
// StandardLuceneGrammarParser(tokens);
// StandardLuceneGrammarParser.mainQ_return returnValue = parser.mainQ();
// CommonTree tree = (CommonTree)returnValue.getTree();
// get the Classes
Class clsLexer = Class
.forName("org.apache.lucene.queryparser.flexible.aqp.parser." + grammar
+ "Lexer");
Class clsParser = Class
.forName("org.apache.lucene.queryparser.flexible.aqp.parser." + grammar
+ "Parser");
// insantiate lexer with one parameter
Class partypes[] = new Class[1];
partypes[0] = CharStream.class;
Constructor ctLexer = clsLexer.getConstructor(partypes);
Object arglist[] = new Object[1];
arglist[0] = in;
Object iLexer = ctLexer.newInstance(arglist);
// get tokens
CommonTokenStream tokens = new CommonTokenStream(
(TokenSource) clsLexer.cast(iLexer));
// instantiate parser using parameters
Class partypes2[] = new Class[1];
partypes2[0] = TokenStream.class;
Constructor ct = clsParser.getConstructor(partypes2);
Object arglist2[] = new Object[1];
arglist2[0] = tokens;
Object iParser = ct.newInstance(arglist2);
// call the mainQ parser rule
Method iParserMainQ = clsParser.getDeclaredMethod(ruleName);
Object retVal = iParserMainQ.invoke(iParser);
Method getMethod = iParserMainQ.getReturnType().getMethod("getTree");
CommonTree tree = (CommonTree) (getMethod.invoke(retVal));
// print the output
if (action.equals("dot")) {
DOTTreeGenerator gen = new DOTTreeGenerator();
StringTemplate st = gen.toDOT(tree);
System.out.println(st);
} else if (action.equals("tree")) {
System.out.println(tree.toStringTree());
}
}
}