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))
       + "...";
 }