import java.io.IOException; import org.basex.build.MemBuilder; import org.basex.build.SingleParser; import org.basex.core.MainOptions; import org.basex.io.IOContent; import org.basex.query.value.item.Str; import org.basex.query.value.node.ANode; import org.basex.query.value.node.DBNode; import org.basex.util.Atts; import org.basex.util.Token; public class XQueryParserForBaseX { public static ANode parseXQuery(Str str) throws IOException { BaseXFunction baseXFunction = new BaseXFunction() { @Override public void execute(CR_xquery_31_20151217 p) {p.parse_XQuery();} }; return baseXFunction.call(str); } public static abstract class BaseXFunction { protected abstract void execute(CR_xquery_31_20151217 p); public ANode call(Str str) throws IOException { String input = str.toJava(); SingleParser singleParser = new SingleParser(new IOContent(""), MainOptions.get()) { @Override protected void parse() throws IOException {} }; MemBuilder memBuilder = new MemBuilder(input, singleParser); memBuilder.init(); BaseXTreeBuilder treeBuilder = new BaseXTreeBuilder(memBuilder); CR_xquery_31_20151217 parser = new CR_xquery_31_20151217(input, treeBuilder); try { execute(parser); } catch (CR_xquery_31_20151217.ParseException pe) { memBuilder = new MemBuilder(input, singleParser); memBuilder.init(); Atts atts = new Atts(); atts.add(Token.token("b"), Token.token(pe.getBegin() + 1)); atts.add(Token.token("e"), Token.token(pe.getEnd() + 1)); if (pe.getOffending() < 0) { atts.add(Token.token("s"), Token.token(pe.getState())); } else { atts.add(Token.token("o"), Token.token(pe.getOffending())); atts.add(Token.token("x"), Token.token(pe.getExpected())); } memBuilder.openElem(Token.token("ERROR"), atts, new Atts()); memBuilder.text(Token.token(parser.getErrorMessage(pe))); memBuilder.closeElem(); } return new DBNode(memBuilder.data()); } } public static class BaseXTreeBuilder implements CR_xquery_31_20151217.EventHandler { private CharSequence input; private MemBuilder builder; private Atts nsp = new Atts(); private Atts atts = new Atts(); public BaseXTreeBuilder(MemBuilder b) { input = null; builder = b; } @Override public void reset(CharSequence string) { input = string; } @Override public void startNonterminal(String name, int begin) { try { builder.openElem(Token.token(name), atts, nsp); } catch (IOException e) { throw new RuntimeException(e); } } @Override public void endNonterminal(String name, int end) { try { builder.closeElem(); } catch (IOException e) { throw new RuntimeException(e); } } @Override public void terminal(String name, int begin, int end) { if (name.charAt(0) == '\'') { name = "TOKEN"; } startNonterminal(name, begin); characters(begin, end); endNonterminal(name, end); } @Override public void whitespace(int begin, int end) { characters(begin, end); } private void characters(int begin, int end) { if (begin < end) { try { builder.text(Token.token(input.subSequence(begin, end).toString())); } catch (IOException e) { throw new RuntimeException(e); } } } } }