parse.y: separate from parse_ident

* parse.y (tokadd_ident, tokenize_ident): extract from
  parse_ident().

* parse.y (parse_gvar, parse_atmark): move tokenization from
  parse_ident().

* parse.y (parse_ident): now deals with non-sigil names only.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46850 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2014-07-17 04:30:44 +00:00
parent 27e1b24776
commit 25a2e870d4

78
parse.y
View File

@ -7367,6 +7367,29 @@ parse_percent(struct parser_params *parser, const int space_seen, const enum lex
return '%';
}
static int
tokadd_ident(struct parser_params *parser, int c)
{
do {
if (tokadd_mbchar(c) == -1) return -1;
c = nextc();
} while (parser_is_identchar());
pushback(c);
return 0;
}
static void
tokenize_ident(struct parser_params *parser, const enum lex_state_e last_state)
{
ID ident = TOK_INTERN();
set_yylval_name(ident);
if (!IS_lex_state_for(last_state, EXPR_DOT|EXPR_FNAME) &&
is_local_id(ident) && lvar_defined(ident)) {
lex_state = EXPR_END;
}
}
static int
parse_gvar(struct parser_params *parser, const enum lex_state_e last_state)
{
@ -7457,7 +7480,11 @@ parse_gvar(struct parser_params *parser, const enum lex_state_e last_state)
case '0':
tokadd('$');
}
return -c;
if (tokadd_ident(parser, c)) return 0;
lex_state = EXPR_END;
tokenize_ident(parser, last_state);
return tGVAR;
}
static int
@ -7483,7 +7510,11 @@ parse_atmark(struct parser_params *parser, const enum lex_state_e last_state)
}
return 0;
}
return -c;
if (tokadd_ident(parser, c)) return 0;
lex_state = EXPR_END;
tokenize_ident(parser, last_state);
return result;
}
static int
@ -7498,35 +7529,14 @@ parse_ident(struct parser_params *parser, int c, int cmd_state)
if (tokadd_mbchar(c) == -1) return 0;
c = nextc();
} while (parser_is_identchar());
switch (tok()[0]) {
case '@': case '$':
pushback(c);
break;
default:
if ((c == '!' || c == '?') && !peek('=')) {
tokadd(c);
}
else {
pushback(c);
}
}
tokfix();
switch (tok()[0]) {
case '$':
lex_state = EXPR_END;
result = tGVAR;
break;
case '@':
lex_state = EXPR_END;
if (tok()[1] == '@')
result = tCVAR;
else
result = tIVAR;
break;
default:
if (toklast() == '!' || toklast() == '?') {
result = tFID;
}
@ -7611,18 +7621,8 @@ parse_ident(struct parser_params *parser, int c, int cmd_state)
else {
lex_state = EXPR_END;
}
}
{
ID ident = TOK_INTERN();
set_yylval_name(ident);
if (!IS_lex_state_for(last_state, EXPR_DOT|EXPR_FNAME) &&
is_local_id(ident) && lvar_defined(ident)) {
lex_state = EXPR_END;
}
}
tokenize_ident(parser, last_state);
return result;
}
@ -8244,16 +8244,10 @@ parser_yylex(struct parser_params *parser)
return parse_percent(parser, space_seen, last_state);
case '$':
c = parse_gvar(parser, last_state);
if (c >= 0) return c;
c = -c;
break;
return parse_gvar(parser, last_state);
case '@':
c = parse_atmark(parser, last_state);
if (c >= 0) return c;
c = -c;
break;
return parse_atmark(parser, last_state);
case '_':
if (was_bol() && whole_match_p("__END__", 7, 0)) {