ruby/lex.c

137 строки
4.4 KiB
C
Исходник Обычный вид История

* error.c (exc_exception): clone the receiver exception instead of creating brand new exception object of the receiver. * eval.c (rb_eval_string_wrap): extend new ruby_top_self, not original self. * eval.c (rb_eval_cmd): respect ruby_wrapper if set. * eval.c (eval): do not update ruby_class unless scope is not provided. * eval.c (eval): preserve wrapper information. * eval.c (proc_invoke): ditto. * eval.c (block_pass): ditto. * parse.y (void_expr): too much warnings for void context (e.g. foo[1] that can be mere Proc call). * error.c (rb_name_error): new function to raise NameError with name attribute set. * eval.c (rb_f_missing): set name and args in the exception object. [new] * error.c (name_name): NameError#name - new method. * error.c (nometh_args): NoMethodError#args - new method. * lex.c (rb_reserved_word): lex_state after tRESCUE should be EXPR_MID. * gc.c (add_heap): allocation size of the heap unit is doubled for each allocation. * dir.c (isdelim): space, tab, and newline are no longer delimiters for glob patterns. * eval.c (svalue_to_avalue): new conversion scheme between single value and array values. * eval.c (avalue_to_svalue): ditto. * eval.c (rb_eval): REXPAND now uses avalue_to_svalue(), return and yield too. * eval.c (rb_yield_0): use avalue_to_svalue(). * eval.c (proc_invoke): Proc#call gives avaules, whereas Proc#yield gives mvalues. * eval.c (bmcall): convert given value (svalue) to avalue. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1555 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2001-07-02 12:46:28 +04:00
/* C code produced by gperf version 2.7.2 */
/* Command-line: gperf -p -j1 -i 1 -g -o -t -N rb_reserved_word -k'1,3,$' ./keywords */
struct kwtable {char *name; int id[2]; enum lex_state state;};
#define TOTAL_KEYWORDS 40
#define MIN_WORD_LENGTH 2
#define MAX_WORD_LENGTH 8
#define MIN_HASH_VALUE 6
#define MAX_HASH_VALUE 55
/* maximum key range = 50, duplicates = 0 */
#ifdef __GNUC__
__inline
* error.c (exc_exception): clone the receiver exception instead of creating brand new exception object of the receiver. * eval.c (rb_eval_string_wrap): extend new ruby_top_self, not original self. * eval.c (rb_eval_cmd): respect ruby_wrapper if set. * eval.c (eval): do not update ruby_class unless scope is not provided. * eval.c (eval): preserve wrapper information. * eval.c (proc_invoke): ditto. * eval.c (block_pass): ditto. * parse.y (void_expr): too much warnings for void context (e.g. foo[1] that can be mere Proc call). * error.c (rb_name_error): new function to raise NameError with name attribute set. * eval.c (rb_f_missing): set name and args in the exception object. [new] * error.c (name_name): NameError#name - new method. * error.c (nometh_args): NoMethodError#args - new method. * lex.c (rb_reserved_word): lex_state after tRESCUE should be EXPR_MID. * gc.c (add_heap): allocation size of the heap unit is doubled for each allocation. * dir.c (isdelim): space, tab, and newline are no longer delimiters for glob patterns. * eval.c (svalue_to_avalue): new conversion scheme between single value and array values. * eval.c (avalue_to_svalue): ditto. * eval.c (rb_eval): REXPAND now uses avalue_to_svalue(), return and yield too. * eval.c (rb_yield_0): use avalue_to_svalue(). * eval.c (proc_invoke): Proc#call gives avaules, whereas Proc#yield gives mvalues. * eval.c (bmcall): convert given value (svalue) to avalue. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1555 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2001-07-02 12:46:28 +04:00
#else
#ifdef __cplusplus
inline
#endif
#endif
static unsigned int
hash (str, len)
register const char *str;
register unsigned int len;
{
static unsigned char 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
};
register int hval = len;
switch (hval)
{
default:
case 3:
hval += asso_values[(unsigned char)str[2]];
case 2:
case 1:
hval += asso_values[(unsigned char)str[0]];
break;
}
return hval + asso_values[(unsigned char)str[len - 1]];
}
#ifdef __GNUC__
__inline
#endif
struct kwtable *
rb_reserved_word (str, len)
register const char *str;
register unsigned int len;
{
static struct kwtable wordlist[] =
{
{""}, {""}, {""}, {""}, {""}, {""},
{"end", {kEND, kEND}, EXPR_END},
{"else", {kELSE, kELSE}, EXPR_BEG},
{"case", {kCASE, kCASE}, EXPR_BEG},
{"ensure", {kENSURE, kENSURE}, EXPR_BEG},
{"module", {kMODULE, kMODULE}, EXPR_BEG},
{"elsif", {kELSIF, kELSIF}, EXPR_BEG},
{"def", {kDEF, kDEF}, EXPR_FNAME},
{"rescue", {kRESCUE, kRESCUE_MOD}, EXPR_MID},
{"not", {kNOT, kNOT}, EXPR_BEG},
{"then", {kTHEN, kTHEN}, EXPR_BEG},
{"yield", {kYIELD, kYIELD}, EXPR_ARG},
{"for", {kFOR, kFOR}, EXPR_BEG},
{"self", {kSELF, kSELF}, EXPR_END},
{"false", {kFALSE, kFALSE}, EXPR_END},
{"retry", {kRETRY, kRETRY}, EXPR_END},
{"return", {kRETURN, kRETURN}, EXPR_MID},
{"true", {kTRUE, kTRUE}, EXPR_END},
{"if", {kIF, kIF_MOD}, EXPR_BEG},
{"defined?", {kDEFINED, kDEFINED}, EXPR_ARG},
{"super", {kSUPER, kSUPER}, EXPR_ARG},
{"undef", {kUNDEF, kUNDEF}, EXPR_FNAME},
{"break", {kBREAK, kBREAK}, EXPR_MID},
{"in", {kIN, kIN}, EXPR_BEG},
{"do", {kDO, kDO}, EXPR_BEG},
{"nil", {kNIL, kNIL}, EXPR_END},
{"until", {kUNTIL, kUNTIL_MOD}, EXPR_BEG},
{"unless", {kUNLESS, kUNLESS_MOD}, EXPR_BEG},
{"or", {kOR, kOR}, EXPR_BEG},
{"next", {kNEXT, kNEXT}, EXPR_MID},
{"when", {kWHEN, kWHEN}, EXPR_BEG},
{"redo", {kREDO, kREDO}, EXPR_END},
{"and", {kAND, kAND}, EXPR_BEG},
{"begin", {kBEGIN, kBEGIN}, EXPR_BEG},
{"__LINE__", {k__LINE__, k__LINE__}, EXPR_END},
{"class", {kCLASS, kCLASS}, EXPR_CLASS},
{"__FILE__", {k__FILE__, k__FILE__}, EXPR_END},
{"END", {klEND, klEND}, EXPR_END},
{"BEGIN", {klBEGIN, klBEGIN}, EXPR_END},
{"while", {kWHILE, kWHILE_MOD}, EXPR_BEG},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""},
{"alias", {kALIAS, kALIAS}, EXPR_FNAME}
};
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
{
register int key = hash (str, len);
if (key <= MAX_HASH_VALUE && key >= 0)
{
register const char *s = wordlist[key].name;
if (*str == *s && !strcmp (str + 1, s + 1))
return &wordlist[key];
}
}
return 0;
}