This project is closed and read-only.
Backport #1183 » tLABEL.patch
| parse.y (working copy) | ||
|---|---|---|
|
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;
|
||
| ... | ... | |
|
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
|
||
| ... | ... | |
|
{
|
||
|
$$ = 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
|
||
| ... | ... | |
|
}
|
||
|
#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()
|
||
| ... | ... | |
|
case EXPR_FNAME:
|
||
|
case EXPR_DOT:
|
||
|
case EXPR_CLASS:
|
||
|
case EXPR_VALUE:
|
||
|
goto retry;
|
||
|
default:
|
||
|
break;
|
||
| ... | ... | |
|
case '?':
|
||
|
if (lex_state == EXPR_END || lex_state == EXPR_ENDARG) {
|
||
|
lex_state = EXPR_BEG;
|
||
|
lex_state = EXPR_VALUE;
|
||
|
return '?';
|
||
|
}
|
||
|
c = nextc();
|
||
| ... | ... | |
|
}
|
||
|
}
|
||
|
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;
|
||
| ... | ... | |
|
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])
|
||
| ... | ... | |
|
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;
|
||
| keywords (working copy) | ||
|---|---|---|
|
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
|
||
| ... | ... | |
|
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
|
||
- « Previous
- 1
- 2
- Next »