/** * Returns a new parser that parses the receiver one or more times, separated * and possibly ended by a {@code separator}." */ public Parser delimitedBy(Parser separator) { return separatedBy(separator) .seq(separator.optional()) .map((List<List<Object>> input) -> { List<Object> result = new ArrayList<>(input.get(0)); if (input.get(1) != null) { result.add(input.get(1)); } return result; }); }
/** * Returns a new parser that parses the receiver one or more times, separated * and possibly ended by a {@code separator}." */ public Parser delimitedBy(Parser separator) { return separatedBy(separator) .seq(separator.optional()) .map((List<List<Object>> input) -> { List<Object> result = new ArrayList<>(input.get(0)); if (input.get(1) != null) { result.add(input.get(1)); } return result; }); }
/** * Returns a new parser that parses the receiver one or more times, separated * by a {@code separator}. */ public Parser separatedBy(Parser separator) { return new SequenceParser(this, new SequenceParser(separator, this).star()) .map((List<List<List<Object>>> input) -> { List<Object> result = new ArrayList<>(); result.add(input.get(0)); input.get(1).forEach(result::addAll); return result; }); }
/** * Returns a new parser that parses the receiver one or more times, separated * by a {@code separator}. */ public Parser separatedBy(Parser separator) { return new SequenceParser(this, new SequenceParser(separator, this).star()) .map((List<List<List<Object>>> input) -> { List<Object> result = new ArrayList<>(); result.add(input.get(0)); input.get(1).forEach(result::addAll); return result; }); }
.seq(ref("space optional")) .seq(ref("attributeValue")) .map((List<?> list) -> callback.createAttribute((TName) list.get(0), (String) list.get(4)))); def("attributeValue", ref("attributeValueDouble") .or(ref("attributeValueSingle")) .seq(any().starLazy(of(CLOSE_COMMENT)).flatten()) .seq(of(CLOSE_COMMENT)) .map((List<String> list) -> callback.createComment(list.get(1)))); def("cdata", of(OPEN_CDATA) .seq(any().starLazy(of(CLOSE_CDATA)).flatten()) .seq(of(CLOSE_CDATA)) .map((List<String> list) -> callback.createCDATA(list.get(1)))); def("content", ref("characterData") .or(ref("element")) .seq(ref("space optional")) .seq(of(CLOSE_DOCTYPE)) .map((List<String> list) -> callback.createDoctype(list.get(2)))); def("document", ref("processing").optional() .seq(ref("misc")) .seq(ref("element")) .seq(ref("misc")) .map((List<TNode> list) -> callback.createDocument(Stream.of(list.get(0), list.get(2), list.get(4)) .filter(Objects::nonNull) .collect(Collectors.toList())))); .seq(ref("qualified"))