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); Parse_XQDocComments parser = new Parse_XQDocComments(); parser.initialize(input, treeBuilder); try { execute(parser); } catch (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 String getErrorMessage(ParseException e) { String[] tokenSet = getExpectedTokenSet(e); String found = getOffendingToken(e); String prefix = input.subSequence(0, e.getBegin()).toString(); int line = prefix.replaceAll("[^\n]", "").length() + 1; int column = prefix.length() - prefix.lastIndexOf('\n'); int size = e.getEnd() - e.getBegin(); return e.getMessage() + (found == null ? "" : ", found " + found) + "\nwhile expecting " + (tokenSet.length == 1 ? tokenSet[0] : java.util.Arrays.toString(tokenSet)) + "\n" + (size == 0 || found != null ? "" : "after successfully scanning " + size + " characters beginning ") + "at line " + line + ", column " + column + ":\n..." + input.subSequence(e.getBegin(), Math.min(input.length(), e.getBegin() + 64)) + "..."; }