label_hash.patch

knu (Akinori MUSHA), 02/20/2009 07:17 pm

Download (4.1 kB)

parse.y (working copy)
91 91
    EXPR_FNAME,			/* ignore newline, no reserved words. */
92 92
    EXPR_DOT,			/* right after `.' or `::', no reserved words. */
93 93
    EXPR_CLASS,			/* immediate after `class', no here document. */
94
    EXPR_VALUE			/* alike EXPR_BEG but label is disallowed. */
94 95
} lex_state;
95 96
static NODE *lex_strterm;
96 97

  
......
267 268
	k__LINE__
268 269
	k__FILE__
269 270

  
270
%token <id>   tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR
271
%token <id>   tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tLABEL
271 272
%token <node> tINTEGER tFLOAT tSTRING_CONTENT
272 273
%token <node> tNTH_REF tBACK_REF
273 274
%token <num>  tREGEXP_END
......
2504 2505
		    {
2505 2506
			$$ = list_append(NEW_LIST($1), $3);
2506 2507
		    }
2508
		| tLABEL arg_value
2509
		    {
2510
			$$ = list_append(NEW_LIST(NEW_LIT(ID2SYM($1))), $2);
2511
		    }
2507 2512
		;
2508 2513

  
2509 2514
operation	: tIDENTIFIER
......
3434 3439
}
3435 3440

  
3436 3441
#define IS_ARG() (lex_state == EXPR_ARG || lex_state == EXPR_CMDARG)
3437
#define IS_BEG() (lex_state == EXPR_BEG || lex_state == EXPR_MID || lex_state == EXPR_CLASS)
3442
#define IS_BEG() (lex_state == EXPR_BEG || lex_state == EXPR_MID || \
3443
                  lex_state == EXPR_VALUE || lex_state == EXPR_CLASS)
3438 3444

  
3439 3445
static int
3440 3446
yylex()
......
3491 3497
	  case EXPR_FNAME:
3492 3498
	  case EXPR_DOT:
3493 3499
	  case EXPR_CLASS:
3500
	  case EXPR_VALUE:
3494 3501
	    goto retry;
3495 3502
	  default:
3496 3503
	    break;
......
3673 3680

  
3674 3681
      case '?':
3675 3682
	if (lex_state == EXPR_END || lex_state == EXPR_ENDARG) {
3676
	    lex_state = EXPR_BEG;
3683
	    lex_state = EXPR_VALUE;
3677 3684
	    return '?';
3678 3685
	}
3679 3686
	c = nextc();
......
3710 3717
	    }
3711 3718
	  ternary:
3712 3719
	    pushback(c);
3713
	    lex_state = EXPR_BEG;
3720
	    lex_state = EXPR_VALUE;
3714 3721
	    return '?';
3715 3722
	}
3716 3723
	else if (ismbchar(c)) {
......
4526 4533
		}
4527 4534
	    }
4528 4535

  
4536
	    if ((lex_state == EXPR_BEG && !cmd_state) ||
4537
		lex_state == EXPR_ARG ||
4538
		lex_state == EXPR_CMDARG) {
4539
		if (peek(':') && !(lex_p + 1 < lex_pend && lex_p[1] == ':')) {
4540
		    lex_state = EXPR_BEG;
4541
		    nextc();
4542
		    yylval.id = rb_intern(tok());
4543
		    return tLABEL;
4544
		}
4545
	    }
4546

  
4529 4547
	    if (lex_state != EXPR_DOT) {
4530 4548
		const struct kwtable *kw;
4531 4549

  
......
4547 4565
			    return kDO_BLOCK;
4548 4566
			return kDO;
4549 4567
		    }
4550
		    if (state == EXPR_BEG)
4568
		    if (state == EXPR_BEG || state == EXPR_VALUE)
4551 4569
			return kw->id[0];
4552 4570
		    else {
4553 4571
			if (kw->id[0] != kw->id[1])
......
4557 4575
		}
4558 4576
	    }
4559 4577

  
4560
	    if (lex_state == EXPR_BEG ||
4561
		lex_state == EXPR_MID ||
4578
	    if (IS_BEG() ||
4562 4579
		lex_state == EXPR_DOT ||
4563
		lex_state == EXPR_ARG ||
4564
		lex_state == EXPR_CLASS ||
4565
		lex_state == EXPR_CMDARG) {
4580
		IS_ARG()) {
4566 4581
		if (cmd_state) {
4567 4582
		    lex_state = EXPR_CMDARG;
4568 4583
		}
NEWS (working copy)
18 18
  specific directories such as library directories, ri directories and
19 19
  gem directories.
20 20

  
21
=== Language core changes
22

  
23
* new syntax
24

  
25
  * New literal syntax for hash is introduced, which is also
26
    applicable to hash style arguments.
27

  
28
      colormap = { apple: 'red', banana: 'yellow', melon: 'green' }
29
      FileUtils.mkdir 'tmp', mode: 0700
30

  
31
    The lines above are equivalent to the lines below:
32

  
33
      colormap = { :apple => 'red', :banana => 'yellow', :melon => 'green' }
34
      FileUtils.mkdir 'tmp', :mode => 0700      
35

  
21 36
=== Library updates (outstanding ones only)
22 37

  
23 38
* builtin classes
ChangeLog (working copy)
1
Thu Feb 19 17:32:59 2009  Akinori MUSHA  <knu@iDaemons.org>
2

  
3
	* parse.y: Backport the new literal syntax for hash and hash style
4
	  arguments; based on the patch by Brent Roman <brent@mbari.org>
5
	  in [ruby-core:21984].
6

  
1 7
Thu Feb 19 14:22:02 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>
2 8

  
3 9
	* lib/mkmf.rb (create_makefile): added phony targets.