package org.erlide.ui.util.text;
import java.util.regex.Pattern;
import org.eclipse.jface.text.rules.ICharacterScanner;
import org.eclipse.jface.text.rules.IPredicateRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.Token;
public class RegexpRule implements IPredicateRule {
private final Pattern pattern;
private final IToken token;
public RegexpRule(final Pattern pattern, final IToken token) {
this.pattern = pattern;
this.token = token;
}
public RegexpRule(final String regexp, final Token token) {
pattern = Pattern.compile(regexp);
this.token = token;
}
@Override
public IToken getSuccessToken() {
return token;
}
@Override
public IToken evaluate(final ICharacterScanner scanner, final boolean resume) {
final StringBuffer buffer = new StringBuffer();
final char[][] lineDelimiters = scanner.getLegalLineDelimiters();
int i = 1;
int c = scanner.read();
while (c != ICharacterScanner.EOF && !isEOL(c, lineDelimiters)) {
buffer.append((char) c);
if (pattern.matcher(buffer.toString()).matches()) {
return token;
}
c = scanner.read();
i++;
}
for (; i > 0; i--) {
scanner.unread();
}
return Token.UNDEFINED;
}
@Override
public IToken evaluate(final ICharacterScanner scanner) {
return evaluate(scanner, false);
}
private boolean isEOL(final int c, final char[][] lineDelimiters) {
for (int i = 0; i < lineDelimiters.length; i++) {
if (c == lineDelimiters[i][0]) {
return true;
}
}
return false;
}
}