| /***** 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; |
| } |
| } |