@Test public void terminatedTrailingOptionalPart() { Grammar g = new Grammar(); Terminal id = g.newTerminal("id"); Terminal comma = g.newTerminal(","); g.newRule(g.getStart(), terminated(id, comma, true)); LRParser parser = new LRParser(new SLRTableGenerator(g).generateTable()); assertFalse(parser.parse(new Terminal[0])); assertFalse(parser.parse(comma)); assertEquals("[[id], []]", "" + parser.parse(asLexemes(id))); assertEquals("[[id, id], []]", "" + parser.parse(asLexemes(id, comma, id))); assertEquals("[[id], [,]]", "" + parser.parse(asLexemes(id, comma))); assertEquals("[[id, id], [,]]", "" + parser.parse(asLexemes(id, comma, id, comma))); }
public static NonTerminal terminated(Symbol item, Symbol separator) { return terminated(item, separator, false); }
GrammarSugar { public static NonTerminal terminated(Symbol item, Symbol separator) { return terminated(item, separator, false); } }
GrammarSugar { public static NonTerminal terminated(Symbol item, Symbol separator) { return terminated(item, separator, false); }  }
GrammarSugar { public static NonTerminal terminated(Symbol item, Symbol separator) { return terminated(item, separator, false); }  static NonTerminal seq(Symbol... symbols); static NonTerminal optional(Symbol symbol); static NonTerminal plus(Symbol symbol); static NonTerminal star(Symbol symbol); static NonTerminal star(Symbol symbol, StarRulesUpdater updater); static NonTerminal oneOf(Symbol first, Symbol... symbols); static NonTerminal oneOf(OneOfRuleUpdater updater, Symbol first, Symbol... symbols); static NonTerminal separated(Symbol item, Symbol separator); static NonTerminal separated(Symbol item, Symbol separator, boolean atLeastOne); static NonTerminal terminated(Symbol item, Symbol separator); static NonTerminal terminated(Symbol item, Symbol separator, boolean trailingOptional); static NonTerminal terminated(Symbol item, Symbol separator, boolean trailingOptional, boolean emptyStart); static NonTerminal terminated(Symbol item, Symbol separator, Symbol terminator, boolean trailingOptional, boolean emptyStart); }
GrammarSugar { public static NonTerminal terminated(Symbol item, Symbol separator) { return terminated(item, separator, false); }  static NonTerminal seq(Symbol... symbols); static NonTerminal optional(Symbol symbol); static NonTerminal plus(Symbol symbol); static NonTerminal star(Symbol symbol); static NonTerminal star(Symbol symbol, StarRulesUpdater updater); static NonTerminal oneOf(Symbol first, Symbol... symbols); static NonTerminal oneOf(OneOfRuleUpdater updater, Symbol first, Symbol... symbols); static NonTerminal separated(Symbol item, Symbol separator); static NonTerminal separated(Symbol item, Symbol separator, boolean atLeastOne); static NonTerminal terminated(Symbol item, Symbol separator); static NonTerminal terminated(Symbol item, Symbol separator, boolean trailingOptional); static NonTerminal terminated(Symbol item, Symbol separator, boolean trailingOptional, boolean emptyStart); static NonTerminal terminated(Symbol item, Symbol separator, Symbol terminator, boolean trailingOptional, boolean emptyStart);  }