From f82dc0ffed78974c8b9a8c284f5538e6762bbc9c Mon Sep 17 00:00:00 2001 From: shyouhei Date: Fri, 31 Jul 2009 08:33:43 +0000 Subject: [PATCH] * 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 --- ChangeLog | 6 ++++++ keywords | 24 ++++++++++++------------ parse.y | 30 ++++++++++++++++++++++++++---- 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2c4ff43cb7..5d5d51d0c7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri Jul 31 17:17:17 2009 URABE Shyouhei + + * 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 * eval.c (rb_event_all, rb_add_event_hook): merged thread-switch diff --git a/keywords b/keywords index 6eed5e1f4d..a7e384a43d 100644 --- a/keywords +++ b/keywords @@ -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 diff --git a/parse.y b/parse.y index 6f192649b8..480c73e366 100644 --- a/parse.y +++ b/parse.y @@ -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 tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR +%token tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tLABEL %token tINTEGER tFLOAT tSTRING_CONTENT %token tNTH_REF tBACK_REF %token 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;