.seq(of(EQUALS)) .seq(ref("space optional")) .seq(ref("attributeValue")) .map((List<?> list) -> callback.createAttribute((TName) list.get(0), (String) list.get(4)))); def("attributeValue", ref("attributeValueDouble") def("attributeValueDouble", of(DOUBLE_QUOTE) .seq(new XmlCharacterParser(DOUBLE_QUOTE, 0)) .seq(of(DOUBLE_QUOTE))); def("attributeValueSingle", of(SINGLE_QUOTE) .seq(new XmlCharacterParser(SINGLE_QUOTE, 0)) .seq(of(SINGLE_QUOTE))); def("attributes", ref("space") .seq(ref("attribute")) def("comment", of(OPEN_COMMENT) .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") def("doctype", of(OPEN_DOCTYPE) .seq(ref("space")) .seq(ref("nameToken") .or(ref("attributeValue"))
private void other() { // the original implementation uses a handwritten parser to // efficiently consume whitespace and comments def("whitespace", whitespace() .or(ref("comment"))); def("comment", of('"') .seq(any().starLazy(of('"'))) .seq(of('"'))); }
.seq(of(']').trim())); def("elements", ref("value").separatedBy(of(',').trim())); def("members", ref("pair").separatedBy(of(',').trim())); def("object", of('{').trim() .seq(ref("members").optional()) .seq(of('}').trim())); def("pair", ref("stringToken") .seq(of(':').trim()) .seq(ref("value"))); def("value", ref("stringToken") .or(ref("numberToken")) def("numberPrimitive", of('-').optional() .seq(of('0').or(digit().plus())) .seq(of('.').seq(digit().plus()).optional()) .seq(anyOf("eE").seq(anyOf("-+").optional()) .seq(digit().plus()).optional())); def("stringPrimitive", of('"') .seq(ref("characterPrimitive").star()) .seq(of('"')));
def("radixInteger", ref("radixSpecifier") .seq(of('r')) .seq(ref("radixDigits"))); def("radixSpecifier", ref("digits")); def("radixDigits", pattern("0-9A-Z").plus()); def("mantissa", ref("digits") .seq(of('.')) .seq(ref("digits"))); def("exponent", of('-') .seq(ref("decimalInteger"))); .seq(ref("fractionalDigits").optional())); def("scaledMantissa", ref("decimalInteger") .or(ref("mantissa")));
.seq(ref("expression").separatedBy(ref("periodToken")) .seq(ref("periodToken").optional()).optional()) .seq(token("}"))); def("arrayItem", ref("literal") .or(ref("symbolLiteralArray")) def("arrayLiteral", token("#(") .seq(ref("arrayItem").star()) .seq(token(")"))); def("arrayLiteralArray", token("(") .seq(ref("arrayItem").star()) .seq(token(")"))); def("assignment", ref("variable") .seq(ref("assignmentToken"))); def("block", token("[") .seq(ref("blockBody")) .seq(token("]"))); def("blockArgument", token(":") .seq(ref("variable"))); def("byteLiteral", token("#[") .seq(ref("numberLiteral").star()) .seq(token("]"))); def("byteLiteralArray", token("[") .seq(ref("numberLiteral").star()) .seq(token("]"))); def("cascadeExpression", ref("keywordExpression") .seq(ref("cascadeMessage").star()));