blob: e14251c5164debe5c7d2cd72d6ff9fb91c97e692 [file] [log] [blame]
/***** BEGIN LICENSE BLOCK *****
* Version: CPL 1.0/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Common Public
* License Version 1.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.eclipse.org/legal/cpl-v10.html
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* Copyright (C) 2002-2004 Jan Arne Petersen <jpetersen@uni-bonn.de>
* Copyright (C) 2004 Anders Bengtsson <ndrsbngtssn@yahoo.se>
* Copyright (C) 2004 Thomas E Enebo <enebo@acm.org>
* Copyright (C) 2004 Stefan Matthias Aust <sma@3plus4.de>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the CPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the CPL, the GPL or the LGPL.
***** END LICENSE BLOCK *****/
package org.jruby.lexer.yacc;
import org.jruby.parser.Tokens;
public class Keyword implements Tokens {
public String name;
public int id0, id1;
public LexState state;
private Keyword() {
this("", 0, 0, LexState.EXPR_BEG);
}
private Keyword(String name, int id0, int id1, LexState state) {
this.name = name;
this.id0 = id0;
this.id1 = id1;
this.state = state;
}
// private static final int TOTAL_KEYWORDS = 40;
private static final int MIN_WORD_LENGTH = 2;
private static final int MAX_WORD_LENGTH = 8;
private static final int MIN_HASH_VALUE = 6;
private static final int MAX_HASH_VALUE = 55;
private static final byte[] asso_values = {
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 11, 56, 56, 36, 56, 1, 37,
31, 1, 56, 56, 56, 56, 29, 56, 1, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 1, 56, 32, 1, 2,
1, 1, 4, 23, 56, 17, 56, 20, 9, 2,
9, 26, 14, 56, 5, 1, 1, 16, 56, 21,
20, 9, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56
};
private static int hash(String str, int len) {
int hval = len;
switch (hval) {
default:
case 3:
hval += asso_values[str.charAt(2) & 255];
case 2:
case 1:
hval += asso_values[str.charAt(0) & 255];
break;
}
return hval + asso_values[str.charAt(len - 1) & 255];
}
private static final Keyword[] wordlist = {
new Keyword(),
new Keyword(),
new Keyword(),
new Keyword(),
new Keyword(),
new Keyword(),
new Keyword("end", kEND, kEND, LexState.EXPR_END),
new Keyword("else", kELSE, kELSE, LexState.EXPR_BEG),
new Keyword("case", kCASE, kCASE, LexState.EXPR_BEG),
new Keyword("ensure", kENSURE, kENSURE, LexState.EXPR_BEG),
new Keyword("module", kMODULE, kMODULE, LexState.EXPR_BEG),
new Keyword("elsif", kELSIF, kELSIF, LexState.EXPR_BEG),
new Keyword("def", kDEF, kDEF, LexState.EXPR_FNAME),
new Keyword("rescue", kRESCUE, kRESCUE_MOD, LexState.EXPR_MID),
new Keyword("not", kNOT, kNOT, LexState.EXPR_BEG),
new Keyword("then", kTHEN, kTHEN, LexState.EXPR_BEG),
new Keyword("yield", kYIELD, kYIELD, LexState.EXPR_ARG),
new Keyword("for", kFOR, kFOR, LexState.EXPR_BEG),
new Keyword("self", kSELF, kSELF, LexState.EXPR_END),
new Keyword("false", kFALSE, kFALSE, LexState.EXPR_END),
new Keyword("retry", kRETRY, kRETRY, LexState.EXPR_END),
new Keyword("return", kRETURN, kRETURN, LexState.EXPR_MID),
new Keyword("true", kTRUE, kTRUE, LexState.EXPR_END),
new Keyword("if", kIF, kIF_MOD, LexState.EXPR_BEG),
new Keyword("defined?", kDEFINED, kDEFINED, LexState.EXPR_ARG),
new Keyword("super", kSUPER, kSUPER, LexState.EXPR_ARG),
new Keyword("undef", kUNDEF, kUNDEF, LexState.EXPR_FNAME),
new Keyword("break", kBREAK, kBREAK, LexState.EXPR_MID),
new Keyword("in", kIN, kIN, LexState.EXPR_BEG),
new Keyword("do", kDO, kDO, LexState.EXPR_BEG),
new Keyword("nil", kNIL, kNIL, LexState.EXPR_END),
new Keyword("until", kUNTIL, kUNTIL_MOD, LexState.EXPR_BEG),
new Keyword("unless", kUNLESS, kUNLESS_MOD, LexState.EXPR_BEG),
new Keyword("or", kOR, kOR, LexState.EXPR_BEG),
new Keyword("next", kNEXT, kNEXT, LexState.EXPR_MID),
new Keyword("when", kWHEN, kWHEN, LexState.EXPR_BEG),
new Keyword("redo", kREDO, kREDO, LexState.EXPR_END),
new Keyword("and", kAND, kAND, LexState.EXPR_BEG),
new Keyword("begin", kBEGIN, kBEGIN, LexState.EXPR_BEG),
new Keyword("__LINE__", k__LINE__, k__LINE__, LexState.EXPR_END),
new Keyword("class", kCLASS, kCLASS, LexState.EXPR_CLASS),
new Keyword("__FILE__", k__FILE__, k__FILE__, LexState.EXPR_END),
new Keyword("END", klEND, klEND, LexState.EXPR_END),
new Keyword("BEGIN", klBEGIN, klBEGIN, LexState.EXPR_END),
new Keyword("while", kWHILE, kWHILE_MOD, LexState.EXPR_BEG),
new Keyword(),
new Keyword(),
new Keyword(),
new Keyword(),
new Keyword(),
new Keyword(),
new Keyword(),
new Keyword(),
new Keyword(),
new Keyword(),
new Keyword("alias", kALIAS, kALIAS, LexState.EXPR_FNAME)
};
public static Keyword getKeyword(String str, int len) {
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) {
int key = hash(str, len);
if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE) {
if (str.equals(wordlist[key].name)) {
return wordlist[key];
}
}
}
return null;
}
}