tLABEL.patch

a patch to implement "label: value" style hash, for 1.8 - shyouhei (Shyouhei Urabe), 07/23/2009 03:49 am

Download (4.3 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
		    /*%%%*/
2511
			$$ = list_append(NEW_LIST(NEW_LIT(ID2SYM($1))), $2);
2512
		    /*%
2513
			$$ = dispatch2(assoc_new, $1, $2);
2514
		    %*/
2515
		    }
2507 2516
		;
2508 2517

  
2509 2518
operation	: tIDENTIFIER
......
3434 3443
}
3435 3444

  
3436 3445
#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)
3446
#define IS_BEG() (lex_state == EXPR_BEG || lex_state == EXPR_MID || \
3447
                  lex_state == EXPR_VALUE || lex_state == EXPR_CLASS)
3438 3448

  
3439 3449
static int
3440 3450
yylex()
......
3491 3501
	  case EXPR_FNAME:
3492 3502
	  case EXPR_DOT:
3493 3503
	  case EXPR_CLASS:
3504
          case EXPR_VALUE:
3494 3505
	    goto retry;
3495 3506
	  default:
3496 3507
	    break;
......
3673 3684

  
3674 3685
      case '?':
3675 3686
	if (lex_state == EXPR_END || lex_state == EXPR_ENDARG) {
3676
	    lex_state = EXPR_BEG;
3687
	    lex_state = EXPR_VALUE;
3677 3688
	    return '?';
3678 3689
	}
3679 3690
	c = nextc();
......
4526 4537
		}
4527 4538
	    }
4528 4539

  
4540
	    if ((lex_state == EXPR_BEG && !cmd_state) ||
4541
		lex_state == EXPR_ARG ||
4542
		lex_state == EXPR_CMDARG) {
4543
		if (peek(':') && !(lex_p + 1 < lex_pend && lex_p[1] == ':')) {
4544
		    lex_state = EXPR_BEG;
4545
		    nextc();
4546
		    yylval.id = rb_intern(tok());
4547
		    return tLABEL;
4548
		}
4549
	    }
4529 4550
	    if (lex_state != EXPR_DOT) {
4530 4551
		const struct kwtable *kw;
4531 4552

  
......
4547 4568
			    return kDO_BLOCK;
4548 4569
			return kDO;
4549 4570
		    }
4550
		    if (state == EXPR_BEG)
4571
		    if (state == EXPR_BEG || state == EXPR_VALUE)
4551 4572
			return kw->id[0];
4552 4573
		    else {
4553 4574
			if (kw->id[0] != kw->id[1])
......
4562 4583
		lex_state == EXPR_DOT ||
4563 4584
		lex_state == EXPR_ARG ||
4564 4585
		lex_state == EXPR_CLASS ||
4586
                lex_state == EXPR_VALUE ||
4565 4587
		lex_state == EXPR_CMDARG) {
4566 4588
		if (cmd_state) {
4567 4589
		    lex_state = EXPR_CMDARG;
keywords (working copy)
5 5
BEGIN, {klBEGIN, klBEGIN}, EXPR_END
6 6
END, {klEND, klEND}, EXPR_END
7 7
alias, {kALIAS, kALIAS}, EXPR_FNAME
8
and, {kAND, kAND}, EXPR_BEG
8
and, {kAND, kAND}, EXPR_VALUE
9 9
begin, {kBEGIN, kBEGIN}, EXPR_BEG
10 10
break, {kBREAK, kBREAK}, EXPR_MID
11
case, {kCASE, kCASE}, EXPR_BEG
11
case, {kCASE, kCASE}, EXPR_VALUE
12 12
class, {kCLASS, kCLASS}, EXPR_CLASS
13 13
def, {kDEF, kDEF}, EXPR_FNAME
14 14
defined?, {kDEFINED, kDEFINED}, EXPR_ARG
15 15
do, {kDO, kDO}, EXPR_BEG
16 16
else, {kELSE, kELSE}, EXPR_BEG
17
elsif, {kELSIF, kELSIF}, EXPR_BEG
17
elsif, {kELSIF, kELSIF}, EXPR_VALUE
18 18
end, {kEND, kEND}, EXPR_END
19 19
ensure, {kENSURE, kENSURE}, EXPR_BEG
20 20
false, {kFALSE, kFALSE}, EXPR_END
21
for, {kFOR, kFOR}, EXPR_BEG
22
if, {kIF, kIF_MOD}, EXPR_BEG
23
in, {kIN, kIN}, EXPR_BEG
24
module, {kMODULE, kMODULE}, EXPR_BEG
21
for, {kFOR, kFOR}, EXPR_VALUE
22
if, {kIF, kIF_MOD}, EXPR_VALUE
23
in, {kIN, kIN}, EXPR_VALUE
24
module, {kMODULE, kMODULE}, EXPR_VALUE
25 25
next, {kNEXT, kNEXT}, EXPR_MID
26 26
nil, {kNIL, kNIL}, EXPR_END
27 27
not, {kNOT, kNOT}, EXPR_BEG
28
or, {kOR, kOR}, EXPR_BEG
28
or, {kOR, kOR}, EXPR_VALUE
29 29
redo, {kREDO, kREDO}, EXPR_END
30 30
rescue, {kRESCUE, kRESCUE_MOD}, EXPR_MID
31 31
retry, {kRETRY, kRETRY}, EXPR_END
......
35 35
then, {kTHEN, kTHEN}, EXPR_BEG
36 36
true, {kTRUE, kTRUE}, EXPR_END
37 37
undef, {kUNDEF, kUNDEF}, EXPR_FNAME
38
unless, {kUNLESS, kUNLESS_MOD}, EXPR_BEG
39
until, {kUNTIL, kUNTIL_MOD}, EXPR_BEG
40
when, {kWHEN, kWHEN}, EXPR_BEG
41
while, {kWHILE, kWHILE_MOD}, EXPR_BEG
38
unless, {kUNLESS, kUNLESS_MOD}, EXPR_VALUE
39
until, {kUNTIL, kUNTIL_MOD}, EXPR_VALUE
40
when, {kWHEN, kWHEN}, EXPR_VALUE
41
while, {kWHILE, kWHILE_MOD}, EXPR_VALUE
42 42
yield, {kYIELD, kYIELD}, EXPR_ARG