package org.rubypeople.rdt.internal.compiler.parser; public abstract class ScannerHelper { public final static int MAX_OBVIOUS = 128; public final static int[] OBVIOUS_IDENT_CHAR_NATURES = new int[MAX_OBVIOUS]; public final static int C_JLS_SPACE = 0x100; public final static int C_SPECIAL = 0x80; public final static int C_IDENT_START = 0x40; public final static int C_UPPER_LETTER = 0x20; public final static int C_LOWER_LETTER = 0x10; public final static int C_IDENT_PART = 0x8; public final static int C_DIGIT = 0x4; public final static int C_SEPARATOR = 0x2; public final static int C_SPACE = 0x1; static { OBVIOUS_IDENT_CHAR_NATURES[0] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[1] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[2] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[3] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[4] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[5] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[6] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[7] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[8] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[14] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[15] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[16] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[17] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[18] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[19] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[20] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[21] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[22] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[23] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[24] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[25] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[26] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[27] = C_IDENT_PART; OBVIOUS_IDENT_CHAR_NATURES[127] = C_IDENT_PART; for (int i = '0'; i <= '9'; i++) OBVIOUS_IDENT_CHAR_NATURES[i] = C_DIGIT | C_IDENT_PART; for (int i = 'a'; i <= 'z'; i++) OBVIOUS_IDENT_CHAR_NATURES[i] = C_LOWER_LETTER | C_IDENT_PART | C_IDENT_START; for (int i = 'A'; i <= 'Z'; i++) OBVIOUS_IDENT_CHAR_NATURES[i] = C_UPPER_LETTER | C_IDENT_PART | C_IDENT_START; OBVIOUS_IDENT_CHAR_NATURES['_'] = C_SPECIAL | C_IDENT_PART | C_IDENT_START; OBVIOUS_IDENT_CHAR_NATURES['$'] = C_SPECIAL | C_IDENT_PART | C_IDENT_START; OBVIOUS_IDENT_CHAR_NATURES[9] = C_SPACE | C_JLS_SPACE; // \ u0009: HORIZONTAL TABULATION OBVIOUS_IDENT_CHAR_NATURES[10] = C_SPACE | C_JLS_SPACE; // \ u000a: LINE FEED OBVIOUS_IDENT_CHAR_NATURES[11] = C_SPACE; OBVIOUS_IDENT_CHAR_NATURES[12] = C_SPACE | C_JLS_SPACE; // \ u000c: FORM FEED OBVIOUS_IDENT_CHAR_NATURES[13] = C_SPACE | C_JLS_SPACE; // \ u000d: CARRIAGE RETURN OBVIOUS_IDENT_CHAR_NATURES[28] = C_SPACE; OBVIOUS_IDENT_CHAR_NATURES[29] = C_SPACE; OBVIOUS_IDENT_CHAR_NATURES[30] = C_SPACE; OBVIOUS_IDENT_CHAR_NATURES[31] = C_SPACE; OBVIOUS_IDENT_CHAR_NATURES[32] = C_SPACE | C_JLS_SPACE; // \ u0020: SPACE OBVIOUS_IDENT_CHAR_NATURES['.'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES[':'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES[';'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES[','] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['['] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES[']'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['('] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES[')'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['{'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['}'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['+'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['-'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['*'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['/'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['='] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['&'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['|'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['?'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['<'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['>'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['!'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['%'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['^'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['~'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['"'] = C_SEPARATOR; OBVIOUS_IDENT_CHAR_NATURES['\''] = C_SEPARATOR; } public static char toLowerCase(char c) { if (c < MAX_OBVIOUS) { if ((ScannerHelper.OBVIOUS_IDENT_CHAR_NATURES[c] & ScannerHelper.C_LOWER_LETTER) != 0) { return c; } else if ((ScannerHelper.OBVIOUS_IDENT_CHAR_NATURES[c] & ScannerHelper.C_UPPER_LETTER) != 0) { return (char) (32 + c); } } return Character.toLowerCase(c); } public static boolean isUpperCase(char c) { if (c < MAX_OBVIOUS) { return (ScannerHelper.OBVIOUS_IDENT_CHAR_NATURES[c] & ScannerHelper.C_UPPER_LETTER) != 0; } return Character.isUpperCase(c); } public static boolean isJavaIdentifierStart(char c) { if (c < MAX_OBVIOUS) { return (ScannerHelper.OBVIOUS_IDENT_CHAR_NATURES[c] & ScannerHelper.C_IDENT_START) != 0; } return Character.isJavaIdentifierStart(c); } /** * Include also non JLS whitespaces. * * return true if Character.isWhitespace(c) would return true */ public static boolean isWhitespace(char c) { if (c < MAX_OBVIOUS) { return (ScannerHelper.OBVIOUS_IDENT_CHAR_NATURES[c] & ScannerHelper.C_SPACE) != 0; } return Character.isWhitespace(c); } }