Skip to content

Instantly share code, notes, and snippets.

@fge
Created December 27, 2011 23:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fge/1525449 to your computer and use it in GitHub Desktop.
Save fge/1525449 to your computer and use it in GitHub Desktop.
Repeat() and Join()
package org.parboiled.examples.css;
import org.parboiled.BaseParser;
import org.parboiled.Rule;
import org.parboiled.annotations.BuildParseTree;
import java.util.ArrayList;
import java.util.List;
@BuildParseTree
public class RepeatJoin
extends BaseParser<Object>
{
Rule Repeat(final int repetitions, final Object rule)
{
if (repetitions <= 0)
throw new IllegalStateException();
if (repetitions == 1)
return toRule(rule);
final List<Object> l = new ArrayList<Object>(repetitions);
for (int i = 0; i < repetitions; i++)
l.add(rule);
return Sequence(l.toArray());
}
Rule Join(final int repetitions, final Object rule, final Object separator)
{
if (repetitions <= 0)
throw new IllegalStateException();
if (repetitions == 1)
return toRule(rule);
final List<Object> rules = new ArrayList<Object>(repetitions * 2 - 1);
rules.add(rule);
for (int i = 1; i < repetitions; i++) {
rules.add(separator);
rules.add(rule);
}
return Sequence(rules.toArray());
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment