package org.jkiss.dbeaver.lang.parser; import org.eclipse.jface.text.rules.ICharacterScanner; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.Token; import org.jkiss.dbeaver.lang.SCMKeyword; import org.jkiss.dbeaver.lang.SCMKeywordToken; import java.util.HashMap; import java.util.Locale; import java.util.Map; public class KeywordRule extends LiteralRule { private final Map<String, SCMKeyword> keywordMap = new HashMap<>(); private final StringBuilder buffer = new StringBuilder(); public KeywordRule(SCMKeyword[] keywords) { for (SCMKeyword keyword : keywords) { this.keywordMap.put(keyword.name(), keyword); } } @Override public IToken evaluate(ICharacterScanner scanner) { int c = scanner.read(); if (c != ICharacterScanner.EOF && isWordStart((char) c)) { buffer.setLength(0); do { buffer.append((char)c); c = scanner.read(); } while (c != ICharacterScanner.EOF && isWordPart((char) c)); scanner.unread(); SCMKeyword keyword = keywordMap.get(buffer.toString().toUpperCase(Locale.ENGLISH)); if (keyword != null) { return new SCMKeywordToken(keyword); } for (int i = buffer.length() - 1; i > 0; i--) { scanner.unread(); } } scanner.unread(); return Token.UNDEFINED; } private boolean isWordStart(char c) { return Character.isLetter(c); } private boolean isWordPart(char c) { return Character.isJavaIdentifierPart(c); } }