tLABEL.patch
| 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
|