[前][次][番号順一覧][スレッド一覧]

ruby-changes:12625

From: shyouhei <ko1@a...>
Date: Fri, 31 Jul 2009 17:34:01 +0900 (JST)
Subject: [ruby-changes:12625] Ruby:r24338 (ruby_1_8): * parse.y: Support for { key: value } -style hash immediates.

shyouhei	2009-07-31 17:33:43 +0900 (Fri, 31 Jul 2009)

  New Revision: 24338

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=24338

  Log:
    * parse.y: Support for { key: value } -style hash immediates.
      [ruby-core:21946][ruby-core:22286]
    * keywords: ditto.

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/keywords
    branches/ruby_1_8/parse.y

Index: ruby_1_8/parse.y
===================================================================
--- ruby_1_8/parse.y	(revision 24337)
+++ ruby_1_8/parse.y	(revision 24338)
@@ -91,6 +91,7 @@
     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 @@
 	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 @@
 		    {
 			$$ = 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 @@
 }
 
 #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 @@
 	  case EXPR_FNAME:
 	  case EXPR_DOT:
 	  case EXPR_CLASS:
+          case EXPR_VALUE:
 	    goto retry;
 	  default:
 	    break;
@@ -3673,7 +3684,7 @@
 
       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 @@
 		}
 	    }
 
+	    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 @@
 			    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 @@
 		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;
Index: ruby_1_8/keywords
===================================================================
--- ruby_1_8/keywords	(revision 24337)
+++ ruby_1_8/keywords	(revision 24338)
@@ -5,27 +5,27 @@
 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 @@
 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
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 24337)
+++ ruby_1_8/ChangeLog	(revision 24338)
@@ -1,3 +1,9 @@
+Fri Jul 31 17:17:17 2009  URABE Shyouhei  <shyouhei@r...>
+
+	* 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@r...>
 
 	* eval.c (rb_event_all, rb_add_event_hook): merged thread-switch

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]