1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* parse.y: Support for { key: value } -style hash immediates.

[ruby-core:21946][ruby-core:22286]
	* keywords: ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@24338 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
shyouhei 2009-07-31 08:33:43 +00:00
parent 56057f9f8f
commit f82dc0ffed
3 changed files with 44 additions and 16 deletions

View file

@ -1,3 +1,9 @@
Fri Jul 31 17:17:17 2009 URABE Shyouhei <shyouhei@ruby-lang.org>
* parse.y: Support for { key: value } -style hash immediates.
[ruby-core:21946][ruby-core:22286]
* keywords: ditto.
Tue Jul 28 15:48:15 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* eval.c (rb_event_all, rb_add_event_hook): merged thread-switch

View file

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

30
parse.y
View file

@ -91,6 +91,7 @@ static enum lex_state {
EXPR_FNAME, /* ignore newline, no reserved words. */
EXPR_DOT, /* right after `.' or `::', no reserved words. */
EXPR_CLASS, /* immediate after `class', no here document. */
EXPR_VALUE /* alike EXPR_BEG but label is disallowed. */
} lex_state;
static NODE *lex_strterm;
@ -267,7 +268,7 @@ static void fixup_nodes();
k__LINE__
k__FILE__
%token <id> tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR
%token <id> tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tLABEL
%token <node> tINTEGER tFLOAT tSTRING_CONTENT
%token <node> tNTH_REF tBACK_REF
%token <num> tREGEXP_END
@ -2504,6 +2505,14 @@ assoc : arg_value tASSOC arg_value
{
$$ = list_append(NEW_LIST($1), $3);
}
| tLABEL arg_value
{
/*%%%*/
$$ = list_append(NEW_LIST(NEW_LIT(ID2SYM($1))), $2);
/*%
$$ = dispatch2(assoc_new, $1, $2);
%*/
}
;
operation : tIDENTIFIER
@ -3434,7 +3443,8 @@ arg_ambiguous()
}
#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_CLASS)
#define IS_BEG() (lex_state == EXPR_BEG || lex_state == EXPR_MID || \
lex_state == EXPR_VALUE || lex_state == EXPR_CLASS)
static int
yylex()
@ -3491,6 +3501,7 @@ yylex()
case EXPR_FNAME:
case EXPR_DOT:
case EXPR_CLASS:
case EXPR_VALUE:
goto retry;
default:
break;
@ -3673,7 +3684,7 @@ yylex()
case '?':
if (lex_state == EXPR_END || lex_state == EXPR_ENDARG) {
lex_state = EXPR_BEG;
lex_state = EXPR_VALUE;
return '?';
}
c = nextc();
@ -4526,6 +4537,16 @@ yylex()
}
}
if ((lex_state == EXPR_BEG && !cmd_state) ||
lex_state == EXPR_ARG ||
lex_state == EXPR_CMDARG) {
if (peek(':') && !(lex_p + 1 < lex_pend && lex_p[1] == ':')) {
lex_state = EXPR_BEG;
nextc();
yylval.id = rb_intern(tok());
return tLABEL;
}
}
if (lex_state != EXPR_DOT) {
const struct kwtable *kw;
@ -4547,7 +4568,7 @@ yylex()
return kDO_BLOCK;
return kDO;
}
if (state == EXPR_BEG)
if (state == EXPR_BEG || state == EXPR_VALUE)
return kw->id[0];
else {
if (kw->id[0] != kw->id[1])
@ -4562,6 +4583,7 @@ yylex()
lex_state == EXPR_DOT ||
lex_state == EXPR_ARG ||
lex_state == EXPR_CLASS ||
lex_state == EXPR_VALUE ||
lex_state == EXPR_CMDARG) {
if (cmd_state) {
lex_state = EXPR_CMDARG;