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:
parent
27e1b24776
commit
25a2e870d4
78
parse.y
78
parse.y
@ -7367,6 +7367,29 @@ parse_percent(struct parser_params *parser, const int space_seen, const enum lex
|
|||||||
return '%';
|
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
|
static int
|
||||||
parse_gvar(struct parser_params *parser, const enum lex_state_e last_state)
|
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':
|
case '0':
|
||||||
tokadd('$');
|
tokadd('$');
|
||||||
}
|
}
|
||||||
return -c;
|
|
||||||
|
if (tokadd_ident(parser, c)) return 0;
|
||||||
|
lex_state = EXPR_END;
|
||||||
|
tokenize_ident(parser, last_state);
|
||||||
|
return tGVAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -7483,7 +7510,11 @@ parse_atmark(struct parser_params *parser, const enum lex_state_e last_state)
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -c;
|
|
||||||
|
if (tokadd_ident(parser, c)) return 0;
|
||||||
|
lex_state = EXPR_END;
|
||||||
|
tokenize_ident(parser, last_state);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -7498,35 +7529,14 @@ parse_ident(struct parser_params *parser, int c, int cmd_state)
|
|||||||
if (tokadd_mbchar(c) == -1) return 0;
|
if (tokadd_mbchar(c) == -1) return 0;
|
||||||
c = nextc();
|
c = nextc();
|
||||||
} while (parser_is_identchar());
|
} while (parser_is_identchar());
|
||||||
switch (tok()[0]) {
|
|
||||||
case '@': case '$':
|
|
||||||
pushback(c);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if ((c == '!' || c == '?') && !peek('=')) {
|
if ((c == '!' || c == '?') && !peek('=')) {
|
||||||
tokadd(c);
|
tokadd(c);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
pushback(c);
|
pushback(c);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
tokfix();
|
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() == '?') {
|
if (toklast() == '!' || toklast() == '?') {
|
||||||
result = tFID;
|
result = tFID;
|
||||||
}
|
}
|
||||||
@ -7611,18 +7621,8 @@ parse_ident(struct parser_params *parser, int c, int cmd_state)
|
|||||||
else {
|
else {
|
||||||
lex_state = EXPR_END;
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8244,16 +8244,10 @@ parser_yylex(struct parser_params *parser)
|
|||||||
return parse_percent(parser, space_seen, last_state);
|
return parse_percent(parser, space_seen, last_state);
|
||||||
|
|
||||||
case '$':
|
case '$':
|
||||||
c = parse_gvar(parser, last_state);
|
return parse_gvar(parser, last_state);
|
||||||
if (c >= 0) return c;
|
|
||||||
c = -c;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '@':
|
case '@':
|
||||||
c = parse_atmark(parser, last_state);
|
return parse_atmark(parser, last_state);
|
||||||
if (c >= 0) return c;
|
|
||||||
c = -c;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case '_':
|
case '_':
|
||||||
if (was_bol() && whole_match_p("__END__", 7, 0)) {
|
if (was_bol() && whole_match_p("__END__", 7, 0)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user