* keywords, parse.y: separate EXPR_VALUE from EXPR_BEG.

fixed: [ruby-core:04310], [ruby-core:04368]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7922 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2005-02-08 13:39:47 +00:00
parent c1f29da23d
commit 891c4aa199
4 changed files with 40 additions and 50 deletions

View File

@ -1,3 +1,8 @@
Tue Feb 8 22:38:28 2005 Nobuyoshi Nakada <nobu@ruby-lang.org>
* keywords, parse.y: separate EXPR_VALUE from EXPR_BEG.
fixed: [ruby-core:04310], [ruby-core:04368]
Tue Feb 8 00:19:02 2005 Tanaka Akira <akr@m17n.org> Tue Feb 8 00:19:02 2005 Tanaka Akira <akr@m17n.org>
* lib/resolv.rb (Resolv::DNS::Name#subdomain_of?): new method. * lib/resolv.rb (Resolv::DNS::Name#subdomain_of?): new method.

View File

@ -8,27 +8,27 @@ __FILE__, {k__FILE__, k__FILE__}, EXPR_END
BEGIN, {klBEGIN, klBEGIN}, EXPR_END BEGIN, {klBEGIN, klBEGIN}, EXPR_END
END, {klEND, klEND}, EXPR_END END, {klEND, klEND}, EXPR_END
alias, {kALIAS, kALIAS}, EXPR_FNAME alias, {kALIAS, kALIAS}, EXPR_FNAME
and, {kAND, kAND}, EXPR_BEG and, {kAND, kAND}, EXPR_VALUE
begin, {kBEGIN, kBEGIN}, EXPR_BEG begin, {kBEGIN, kBEGIN}, EXPR_BEG
break, {kBREAK, kBREAK}, EXPR_MID break, {kBREAK, kBREAK}, EXPR_MID
case, {kCASE, kCASE}, EXPR_BEG case, {kCASE, kCASE}, EXPR_VALUE
class, {kCLASS, kCLASS}, EXPR_CLASS class, {kCLASS, kCLASS}, EXPR_CLASS
def, {kDEF, kDEF}, EXPR_FNAME def, {kDEF, kDEF}, EXPR_FNAME
defined?, {kDEFINED, kDEFINED}, EXPR_ARG defined?, {kDEFINED, kDEFINED}, EXPR_ARG
do, {kDO, kDO}, EXPR_BEG do, {kDO, kDO}, EXPR_BEG
else, {kELSE, kELSE}, EXPR_BEG else, {kELSE, kELSE}, EXPR_BEG
elsif, {kELSIF, kELSIF}, EXPR_BEG elsif, {kELSIF, kELSIF}, EXPR_VALUE
end, {kEND, kEND}, EXPR_END end, {kEND, kEND}, EXPR_END
ensure, {kENSURE, kENSURE}, EXPR_BEG ensure, {kENSURE, kENSURE}, EXPR_BEG
false, {kFALSE, kFALSE}, EXPR_END false, {kFALSE, kFALSE}, EXPR_END
for, {kFOR, kFOR}, EXPR_BEG for, {kFOR, kFOR}, EXPR_VALUE
if, {kIF, kIF_MOD}, EXPR_BEG if, {kIF, kIF_MOD}, EXPR_VALUE
in, {kIN, kIN}, EXPR_BEG in, {kIN, kIN}, EXPR_VALUE
module, {kMODULE, kMODULE}, EXPR_BEG module, {kMODULE, kMODULE}, EXPR_VALUE
next, {kNEXT, kNEXT}, EXPR_MID next, {kNEXT, kNEXT}, EXPR_MID
nil, {kNIL, kNIL}, EXPR_END nil, {kNIL, kNIL}, EXPR_END
not, {kNOT, kNOT}, EXPR_BEG not, {kNOT, kNOT}, EXPR_VALUE
or, {kOR, kOR}, EXPR_BEG or, {kOR, kOR}, EXPR_VALUE
redo, {kREDO, kREDO}, EXPR_END redo, {kREDO, kREDO}, EXPR_END
rescue, {kRESCUE, kRESCUE_MOD}, EXPR_MID rescue, {kRESCUE, kRESCUE_MOD}, EXPR_MID
retry, {kRETRY, kRETRY}, EXPR_END retry, {kRETRY, kRETRY}, EXPR_END
@ -38,10 +38,10 @@ super, {kSUPER, kSUPER}, EXPR_ARG
then, {kTHEN, kTHEN}, EXPR_BEG then, {kTHEN, kTHEN}, EXPR_BEG
true, {kTRUE, kTRUE}, EXPR_END true, {kTRUE, kTRUE}, EXPR_END
undef, {kUNDEF, kUNDEF}, EXPR_FNAME undef, {kUNDEF, kUNDEF}, EXPR_FNAME
unless, {kUNLESS, kUNLESS_MOD}, EXPR_BEG unless, {kUNLESS, kUNLESS_MOD}, EXPR_VALUE
until, {kUNTIL, kUNTIL_MOD}, EXPR_BEG until, {kUNTIL, kUNTIL_MOD}, EXPR_VALUE
when, {kWHEN, kWHEN}, EXPR_BEG when, {kWHEN, kWHEN}, EXPR_VALUE
while, {kWHILE, kWHILE_MOD}, EXPR_BEG while, {kWHILE, kWHILE_MOD}, EXPR_VALUE
yield, {kYIELD, kYIELD}, EXPR_ARG yield, {kYIELD, kYIELD}, EXPR_ARG
%% %%
#endif #endif

28
lex.c
View File

@ -1,5 +1,5 @@
/* C code produced by gperf version 2.7.2 */ /* 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,$' /home/aamine/c/ruby/keywords */ /* 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_e state;}; struct kwtable {char *name; int id[2]; enum lex_state_e state;};
struct kwtable *rb_reserved_word _((const char *, unsigned int)); struct kwtable *rb_reserved_word _((const char *, unsigned int));
#ifndef RIPPER #ifndef RIPPER
@ -81,43 +81,43 @@ rb_reserved_word (str, len)
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{"end", {kEND, kEND}, EXPR_END}, {"end", {kEND, kEND}, EXPR_END},
{"else", {kELSE, kELSE}, EXPR_BEG}, {"else", {kELSE, kELSE}, EXPR_BEG},
{"case", {kCASE, kCASE}, EXPR_BEG}, {"case", {kCASE, kCASE}, EXPR_VALUE},
{"ensure", {kENSURE, kENSURE}, EXPR_BEG}, {"ensure", {kENSURE, kENSURE}, EXPR_BEG},
{"module", {kMODULE, kMODULE}, EXPR_BEG}, {"module", {kMODULE, kMODULE}, EXPR_VALUE},
{"elsif", {kELSIF, kELSIF}, EXPR_BEG}, {"elsif", {kELSIF, kELSIF}, EXPR_VALUE},
{"def", {kDEF, kDEF}, EXPR_FNAME}, {"def", {kDEF, kDEF}, EXPR_FNAME},
{"rescue", {kRESCUE, kRESCUE_MOD}, EXPR_MID}, {"rescue", {kRESCUE, kRESCUE_MOD}, EXPR_MID},
{"not", {kNOT, kNOT}, EXPR_BEG}, {"not", {kNOT, kNOT}, EXPR_VALUE},
{"then", {kTHEN, kTHEN}, EXPR_BEG}, {"then", {kTHEN, kTHEN}, EXPR_BEG},
{"yield", {kYIELD, kYIELD}, EXPR_ARG}, {"yield", {kYIELD, kYIELD}, EXPR_ARG},
{"for", {kFOR, kFOR}, EXPR_BEG}, {"for", {kFOR, kFOR}, EXPR_VALUE},
{"self", {kSELF, kSELF}, EXPR_END}, {"self", {kSELF, kSELF}, EXPR_END},
{"false", {kFALSE, kFALSE}, EXPR_END}, {"false", {kFALSE, kFALSE}, EXPR_END},
{"retry", {kRETRY, kRETRY}, EXPR_END}, {"retry", {kRETRY, kRETRY}, EXPR_END},
{"return", {kRETURN, kRETURN}, EXPR_MID}, {"return", {kRETURN, kRETURN}, EXPR_MID},
{"true", {kTRUE, kTRUE}, EXPR_END}, {"true", {kTRUE, kTRUE}, EXPR_END},
{"if", {kIF, kIF_MOD}, EXPR_BEG}, {"if", {kIF, kIF_MOD}, EXPR_VALUE},
{"defined?", {kDEFINED, kDEFINED}, EXPR_ARG}, {"defined?", {kDEFINED, kDEFINED}, EXPR_ARG},
{"super", {kSUPER, kSUPER}, EXPR_ARG}, {"super", {kSUPER, kSUPER}, EXPR_ARG},
{"undef", {kUNDEF, kUNDEF}, EXPR_FNAME}, {"undef", {kUNDEF, kUNDEF}, EXPR_FNAME},
{"break", {kBREAK, kBREAK}, EXPR_MID}, {"break", {kBREAK, kBREAK}, EXPR_MID},
{"in", {kIN, kIN}, EXPR_BEG}, {"in", {kIN, kIN}, EXPR_VALUE},
{"do", {kDO, kDO}, EXPR_BEG}, {"do", {kDO, kDO}, EXPR_BEG},
{"nil", {kNIL, kNIL}, EXPR_END}, {"nil", {kNIL, kNIL}, EXPR_END},
{"until", {kUNTIL, kUNTIL_MOD}, EXPR_BEG}, {"until", {kUNTIL, kUNTIL_MOD}, EXPR_VALUE},
{"unless", {kUNLESS, kUNLESS_MOD}, EXPR_BEG}, {"unless", {kUNLESS, kUNLESS_MOD}, EXPR_VALUE},
{"or", {kOR, kOR}, EXPR_BEG}, {"or", {kOR, kOR}, EXPR_VALUE},
{"next", {kNEXT, kNEXT}, EXPR_MID}, {"next", {kNEXT, kNEXT}, EXPR_MID},
{"when", {kWHEN, kWHEN}, EXPR_BEG}, {"when", {kWHEN, kWHEN}, EXPR_VALUE},
{"redo", {kREDO, kREDO}, EXPR_END}, {"redo", {kREDO, kREDO}, EXPR_END},
{"and", {kAND, kAND}, EXPR_BEG}, {"and", {kAND, kAND}, EXPR_VALUE},
{"begin", {kBEGIN, kBEGIN}, EXPR_BEG}, {"begin", {kBEGIN, kBEGIN}, EXPR_BEG},
{"__LINE__", {k__LINE__, k__LINE__}, EXPR_END}, {"__LINE__", {k__LINE__, k__LINE__}, EXPR_END},
{"class", {kCLASS, kCLASS}, EXPR_CLASS}, {"class", {kCLASS, kCLASS}, EXPR_CLASS},
{"__FILE__", {k__FILE__, k__FILE__}, EXPR_END}, {"__FILE__", {k__FILE__, k__FILE__}, EXPR_END},
{"END", {klEND, klEND}, EXPR_END}, {"END", {klEND, klEND}, EXPR_END},
{"BEGIN", {klBEGIN, klBEGIN}, EXPR_END}, {"BEGIN", {klBEGIN, klBEGIN}, EXPR_END},
{"while", {kWHILE, kWHILE_MOD}, EXPR_BEG}, {"while", {kWHILE, kWHILE_MOD}, EXPR_VALUE},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""},
{"alias", {kALIAS, kALIAS}, EXPR_FNAME} {"alias", {kALIAS, kALIAS}, EXPR_FNAME}

31
parse.y
View File

@ -63,7 +63,7 @@ enum lex_state_e {
EXPR_FNAME, /* ignore newline, no reserved words. */ EXPR_FNAME, /* ignore newline, no reserved words. */
EXPR_DOT, /* right after `.' or `::', no reserved words. */ EXPR_DOT, /* right after `.' or `::', no reserved words. */
EXPR_CLASS, /* immediate after `class', no here document. */ EXPR_CLASS, /* immediate after `class', no here document. */
EXPR_TERNARY, /* alike EXPR_BEG but immediate after ternary op. */ EXPR_VALUE, /* alike EXPR_BEG but label is disallowed. */
}; };
# ifdef HAVE_LONG_LONG # ifdef HAVE_LONG_LONG
@ -488,7 +488,7 @@ static void ripper_compile_error _((struct parser_params*, const char *fmt, ...)
%type <node> command_args aref_args opt_block_arg block_arg var_ref var_lhs %type <node> command_args aref_args opt_block_arg block_arg var_ref var_lhs
%type <node> mrhs superclass block_call block_command %type <node> mrhs superclass block_call block_command
%type <node> f_arglist f_args f_optarg f_opt f_block_arg opt_f_block_arg %type <node> f_arglist f_args f_optarg f_opt f_block_arg opt_f_block_arg
%type <node> assoc_list assocs assoc kwargs undef_list backref string_dvar %type <node> assoc_list assocs assoc undef_list backref string_dvar
%type <node> for_var block_var opt_block_var block_par %type <node> for_var block_var opt_block_var block_par
%type <node> brace_block cmd_brace_block do_block lhs none fitem %type <node> brace_block cmd_brace_block do_block lhs none fitem
%type <node> mlhs mlhs_head mlhs_basic mlhs_entry mlhs_item mlhs_node %type <node> mlhs mlhs_head mlhs_basic mlhs_entry mlhs_item mlhs_node
@ -4066,10 +4066,6 @@ assoc_list : none
$$ = dispatch1(assoclist_from_args, $1); $$ = dispatch1(assoclist_from_args, $1);
%*/ %*/
} }
| kwargs trailer
{
$$ = $1;
}
; ;
assocs : assoc assocs : assoc
@ -4097,9 +4093,7 @@ assoc : arg_value tASSOC arg_value
$$ = dispatch2(assoc_new, $1, $3); $$ = dispatch2(assoc_new, $1, $3);
%*/ %*/
} }
; | tLABEL arg_value
kwargs : tLABEL arg_value
{ {
/*%%%*/ /*%%%*/
$$ = list_append(NEW_LIST(NEW_LIT(ID2SYM($1))), $2); $$ = list_append(NEW_LIST(NEW_LIT(ID2SYM($1))), $2);
@ -4107,15 +4101,6 @@ kwargs : tLABEL arg_value
$$ = dispatch2(assoc_new, $1, $2); $$ = dispatch2(assoc_new, $1, $2);
%*/ %*/
} }
| kwargs ',' tLABEL arg_value
{
/*%%%*/
$$ = list_append(NEW_LIST(NEW_LIT(ID2SYM($3))), $4);
$$ = list_concat($1, $$);
/*%
rb_ary_push($$, dispatch2(assoc_new, $3, $4));
%*/
}
; ;
operation : tIDENTIFIER operation : tIDENTIFIER
@ -5235,7 +5220,7 @@ lvar_defined_gen(parser, id)
} }
#define IS_ARG() (lex_state == EXPR_ARG || lex_state == EXPR_CMDARG) #define IS_ARG() (lex_state == EXPR_ARG || lex_state == EXPR_CMDARG)
#define IS_BEG() (lex_state == EXPR_BEG || lex_state == EXPR_MID || lex_state == EXPR_TERNARY || lex_state == EXPR_CLASS) #define IS_BEG() (lex_state == EXPR_BEG || lex_state == EXPR_MID || lex_state == EXPR_VALUE || lex_state == EXPR_CLASS)
static int static int
parser_yylex(parser) parser_yylex(parser)
@ -5319,7 +5304,7 @@ parser_yylex(parser)
case EXPR_FNAME: case EXPR_FNAME:
case EXPR_DOT: case EXPR_DOT:
case EXPR_CLASS: case EXPR_CLASS:
case EXPR_TERNARY: case EXPR_VALUE:
#ifdef RIPPER #ifdef RIPPER
if (!fallthru) { if (!fallthru) {
ripper_dispatch_scan_event(parser, tIGNORED_NL); ripper_dispatch_scan_event(parser, tIGNORED_NL);
@ -5523,7 +5508,7 @@ parser_yylex(parser)
case '?': case '?':
if (lex_state == EXPR_END || lex_state == EXPR_ENDARG) { if (lex_state == EXPR_END || lex_state == EXPR_ENDARG) {
lex_state = EXPR_TERNARY; lex_state = EXPR_VALUE;
return '?'; return '?';
} }
c = nextc(); c = nextc();
@ -5561,7 +5546,7 @@ parser_yylex(parser)
} }
ternary: ternary:
pushback(c); pushback(c);
lex_state = EXPR_TERNARY; lex_state = EXPR_VALUE;
return '?'; return '?';
} }
else if (ismbchar(uc)) { else if (ismbchar(uc)) {
@ -6398,7 +6383,7 @@ parser_yylex(parser)
return kDO_BLOCK; return kDO_BLOCK;
return kDO; return kDO;
} }
if (state == EXPR_BEG || state == EXPR_TERNARY) if (state == EXPR_BEG || state == EXPR_VALUE)
return kw->id[0]; return kw->id[0];
else { else {
if (kw->id[0] != kw->id[1]) if (kw->id[0] != kw->id[1])