00001
00002
00003 struct kwtable {char *name; int id[2]; enum lex_state state;};
00004
00005 #define TOTAL_KEYWORDS 40
00006 #define MIN_WORD_LENGTH 2
00007 #define MAX_WORD_LENGTH 8
00008 #define MIN_HASH_VALUE 6
00009 #define MAX_HASH_VALUE 55
00010
00011
00012 #ifdef __GNUC__
00013 __inline
00014 #else
00015 #ifdef __cplusplus
00016 inline
00017 #endif
00018 #endif
00019 static unsigned int
00020 hash (str, len)
00021 register const char *str;
00022 register unsigned int len;
00023 {
00024 static unsigned char asso_values[] =
00025 {
00026 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00027 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00028 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00029 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00030 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00031 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00032 56, 56, 56, 11, 56, 56, 36, 56, 1, 37,
00033 31, 1, 56, 56, 56, 56, 29, 56, 1, 56,
00034 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00035 56, 56, 56, 56, 56, 1, 56, 32, 1, 2,
00036 1, 1, 4, 23, 56, 17, 56, 20, 9, 2,
00037 9, 26, 14, 56, 5, 1, 1, 16, 56, 21,
00038 20, 9, 56, 56, 56, 56, 56, 56, 56, 56,
00039 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00040 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00041 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00042 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00043 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00044 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00045 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00046 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00047 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00048 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00049 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00050 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
00051 56, 56, 56, 56, 56, 56
00052 };
00053 register int hval = len;
00054
00055 switch (hval)
00056 {
00057 default:
00058 case 3:
00059 hval += asso_values[(unsigned char)str[2]];
00060 case 2:
00061 case 1:
00062 hval += asso_values[(unsigned char)str[0]];
00063 break;
00064 }
00065 return hval + asso_values[(unsigned char)str[len - 1]];
00066 }
00067
00068 #ifdef __GNUC__
00069 __inline
00070 #endif
00071 struct kwtable *
00072 rb_reserved_word (str, len)
00073 register const char *str;
00074 register unsigned int len;
00075 {
00076 static struct kwtable wordlist[] =
00077 {
00078 {""}, {""}, {""}, {""}, {""}, {""},
00079 {"end", {kEND, kEND}, EXPR_END},
00080 {"else", {kELSE, kELSE}, EXPR_BEG},
00081 {"case", {kCASE, kCASE}, EXPR_BEG},
00082 {"ensure", {kENSURE, kENSURE}, EXPR_BEG},
00083 {"module", {kMODULE, kMODULE}, EXPR_BEG},
00084 {"elsif", {kELSIF, kELSIF}, EXPR_BEG},
00085 {"def", {kDEF, kDEF}, EXPR_FNAME},
00086 {"rescue", {kRESCUE, kRESCUE_MOD}, EXPR_MID},
00087 {"not", {kNOT, kNOT}, EXPR_BEG},
00088 {"then", {kTHEN, kTHEN}, EXPR_BEG},
00089 {"yield", {kYIELD, kYIELD}, EXPR_ARG},
00090 {"for", {kFOR, kFOR}, EXPR_BEG},
00091 {"self", {kSELF, kSELF}, EXPR_END},
00092 {"false", {kFALSE, kFALSE}, EXPR_END},
00093 {"retry", {kRETRY, kRETRY}, EXPR_END},
00094 {"return", {kRETURN, kRETURN}, EXPR_MID},
00095 {"true", {kTRUE, kTRUE}, EXPR_END},
00096 {"if", {kIF, kIF_MOD}, EXPR_BEG},
00097 {"defined?", {kDEFINED, kDEFINED}, EXPR_ARG},
00098 {"super", {kSUPER, kSUPER}, EXPR_ARG},
00099 {"undef", {kUNDEF, kUNDEF}, EXPR_FNAME},
00100 {"break", {kBREAK, kBREAK}, EXPR_MID},
00101 {"in", {kIN, kIN}, EXPR_BEG},
00102 {"do", {kDO, kDO}, EXPR_BEG},
00103 {"nil", {kNIL, kNIL}, EXPR_END},
00104 {"until", {kUNTIL, kUNTIL_MOD}, EXPR_BEG},
00105 {"unless", {kUNLESS, kUNLESS_MOD}, EXPR_BEG},
00106 {"or", {kOR, kOR}, EXPR_BEG},
00107 {"next", {kNEXT, kNEXT}, EXPR_MID},
00108 {"when", {kWHEN, kWHEN}, EXPR_BEG},
00109 {"redo", {kREDO, kREDO}, EXPR_END},
00110 {"and", {kAND, kAND}, EXPR_BEG},
00111 {"begin", {kBEGIN, kBEGIN}, EXPR_BEG},
00112 {"__LINE__", {k__LINE__, k__LINE__}, EXPR_END},
00113 {"class", {kCLASS, kCLASS}, EXPR_CLASS},
00114 {"__FILE__", {k__FILE__, k__FILE__}, EXPR_END},
00115 {"END", {klEND, klEND}, EXPR_END},
00116 {"BEGIN", {klBEGIN, klBEGIN}, EXPR_END},
00117 {"while", {kWHILE, kWHILE_MOD}, EXPR_BEG},
00118 {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
00119 {""},
00120 {"alias", {kALIAS, kALIAS}, EXPR_FNAME}
00121 };
00122
00123 if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
00124 {
00125 register int key = hash (str, len);
00126
00127 if (key <= MAX_HASH_VALUE && key >= 0)
00128 {
00129 register const char *s = wordlist[key].name;
00130
00131 if (*str == *s && !strcmp (str + 1, s + 1))
00132 return &wordlist[key];
00133 }
00134 }
00135 return 0;
00136 }
00137