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 '%';
|
||||
}
|
||||
|
||||
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)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user