public DispatchingParser(Map<String, Parser<T>> parsers, Parser<String> directiveParser, Parser<?> whitespaceParser) { parserLookup = new HashMap<String, Parser<T>>(); if (whitespaceParser == null) { inputStringParser = directiveParser; parserLookup.putAll(parsers); } else { inputStringParser = Parsers.prefix(whitespaceParser, directiveParser); for (Entry<String, Parser<T>> entry : parsers.entrySet()) { parserLookup.put(entry.getKey(), Parsers.prefix(whitespaceParser, entry.getValue())); } } }
public DefaultingDispatchingParser(Map<String, Parser<T>> parsers, Parser<String> directiveParser, Parser<?> whitespaceParser) { this.map = new HashMap<String, Parser<T>>(parsers); if (whitespaceParser == null) { inputStringParser = directiveParser; this.map.putAll(parsers); } else { inputStringParser = Parsers.prefix(whitespaceParser, directiveParser); for (Entry<String, Parser<T>> entry : parsers.entrySet()) { this.map.put(entry.getKey(), Parsers.prefix(whitespaceParser, entry.getValue())); } } }
/** * Runs the whitespace parser followed by `parser`, returning result of the latter. * * @param <T> the type the target parser returns * @param parser the target parser to run * @return the specified parser */ public static <T> Parser<T> whitespace(Parser<T> parser) { return prefix(whitespace(), parser); }
@Test public void testMapParser() throws ParseException { Map<String, String> map = new HashMap<String, String>(); map.put("abc", "def"); assertEquals(map, new MapParser<String, String>(new RawStringParser(), Parsers.prefix(Parsers.whitespace(), new RawStringParser()), Parsers.whitespace()).parse( new StringParserState("abc def"))); assertEquals(map, new MapParser<String, String>(Parsers.prefix(Parsers.whitespace(), new RawStringParser()), Parsers.prefix(Parsers.whitespace(), new RawStringParser()), Parsers.whitespace()).parse( new StringParserState(" abc def"))); map.put("ghi", "jkl"); assertEquals(map, new MapParser<String, String>(Parsers.prefix(Parsers.whitespace(), new RawStringParser()), Parsers.prefix(Parsers.whitespace(), new RawStringParser()), Parsers.whitespace()).parse( new StringParserState("abc def ghi jkl"))); }
@Test public void testBetweenParser() throws ParseException { assertEquals("abcdef", new BetweenParser<String>(new ExpectantParser("{"), Parsers.prefix(Parsers.whitespace(), new RawStringParser()), Parsers.prefix(Parsers.whitespace(), new ExpectantParser("}"))) .parse(new StringParserState("{ abcdef }"))); }
@Test public void testMapParserBuiltup() throws ParseException { Map<String, String> map = new HashMap<String, String>(); map.put("abc", "def"); RawStringParser noWhitespaceStringParser = new RawStringParser(); Parser<String> whitespaceStringParser = Parsers.prefix(Parsers.whitespace(), new RawStringParser()); MapParser<String, String> mapParser1 = new MapParser<String, String>(noWhitespaceStringParser, whitespaceStringParser, Parsers.whitespace()); MapParser<String, String> mapParser2 = new MapParser<String, String>(whitespaceStringParser, whitespaceStringParser, Parsers.whitespace()); assertEquals(map, mapParser1.parse(new StringParserState("abc def"))); assertEquals(map, mapParser2.parse(new StringParserState(" abc def"))); map.put("ghi", "jkl"); assertEquals(map, mapParser2.parse(new StringParserState("abc def ghi jkl"))); }