AnyExceptMatcher.java
package com.varnernet.gerb4j;
import org.parboiled.MatcherContext;
import org.parboiled.matchers.CustomMatcher;
import org.parboiled.support.Chars;
import java.util.Arrays;
/**
* A matcher that will match any character except those provided.
*/
public class AnyExceptMatcher extends CustomMatcher {
private final char[] excludes;
/**
* Constructs an AnyExceptMatcher with the given excluded characters.
*
* @param excludes the characters to exclude from matching
*/
public AnyExceptMatcher(final char[] excludes) {
super("ANYBUT");
this.excludes = excludes;
Arrays.sort(this.excludes);
}
@Override
public <V> boolean match(final MatcherContext<V> context) {
switch (context.getCurrentChar()) {
case Chars.DEL_ERROR:
case Chars.INS_ERROR:
case Chars.RESYNC:
case Chars.RESYNC_START:
case Chars.RESYNC_END:
case Chars.RESYNC_EOI:
case Chars.EOI:
return false;
default:
break;
}
if (Arrays.binarySearch(excludes, context.getCurrentChar()) >= 0) {
return false;
}
context.advanceIndex(1);
context.createNode();
return true;
}
@Override
public boolean isSingleCharMatcher() {
return false;
}
@Override
public boolean canMatchEmpty() {
return true;
}
@Override
public boolean isStarterChar(final char c) {
return Arrays.binarySearch(excludes, c) == -1;
}
@Override
public char getStarterChar() {
return ' ';
}
}