mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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
1 changed files with 111 additions and 117 deletions
228
parse.y
228
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,131 +7529,100 @@ 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 '$':
|
||||
if ((c == '!' || c == '?') && !peek('=')) {
|
||||
tokadd(c);
|
||||
}
|
||||
else {
|
||||
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;
|
||||
}
|
||||
else {
|
||||
if (IS_lex_state(EXPR_FNAME)) {
|
||||
register int c = nextc();
|
||||
if (c == '=' && !peek('~') && !peek('>') &&
|
||||
(!peek('=') || (peek_n('>', 1)))) {
|
||||
result = tIDENTIFIER;
|
||||
tokadd(c);
|
||||
tokfix();
|
||||
}
|
||||
else {
|
||||
pushback(c);
|
||||
}
|
||||
}
|
||||
if (result == 0 && ISUPPER(tok()[0])) {
|
||||
result = tCONSTANT;
|
||||
}
|
||||
else {
|
||||
if (toklast() == '!' || toklast() == '?') {
|
||||
result = tFID;
|
||||
}
|
||||
else {
|
||||
if (IS_lex_state(EXPR_FNAME)) {
|
||||
register int c = nextc();
|
||||
if (c == '=' && !peek('~') && !peek('>') &&
|
||||
(!peek('=') || (peek_n('>', 1)))) {
|
||||
result = tIDENTIFIER;
|
||||
}
|
||||
}
|
||||
|
||||
if (IS_LABEL_POSSIBLE()) {
|
||||
if (IS_LABEL_SUFFIX(0)) {
|
||||
lex_state = EXPR_LABELARG;
|
||||
nextc();
|
||||
set_yylval_name(TOK_INTERN());
|
||||
return tLABEL;
|
||||
}
|
||||
}
|
||||
if (mb == ENC_CODERANGE_7BIT && !IS_lex_state(EXPR_DOT)) {
|
||||
const struct kwtable *kw;
|
||||
|
||||
/* See if it is a reserved word. */
|
||||
kw = rb_reserved_word(tok(), toklen());
|
||||
if (kw) {
|
||||
enum lex_state_e state = lex_state;
|
||||
lex_state = kw->state;
|
||||
if (IS_lex_state_for(state, EXPR_FNAME)) {
|
||||
set_yylval_name(rb_intern(kw->name));
|
||||
return kw->id[0];
|
||||
}
|
||||
if (IS_lex_state(EXPR_BEG)) {
|
||||
command_start = TRUE;
|
||||
}
|
||||
if (kw->id[0] == keyword_do) {
|
||||
if (lpar_beg && lpar_beg == paren_nest) {
|
||||
lpar_beg = 0;
|
||||
--paren_nest;
|
||||
return keyword_do_LAMBDA;
|
||||
}
|
||||
if (COND_P()) return keyword_do_cond;
|
||||
if (CMDARG_P() && !IS_lex_state_for(state, EXPR_CMDARG))
|
||||
return keyword_do_block;
|
||||
if (IS_lex_state_for(state, (EXPR_BEG | EXPR_ENDARG)))
|
||||
return keyword_do_block;
|
||||
return keyword_do;
|
||||
}
|
||||
if (IS_lex_state_for(state, (EXPR_BEG | EXPR_VALUE)))
|
||||
return kw->id[0];
|
||||
else {
|
||||
if (kw->id[0] != kw->id[1])
|
||||
lex_state = EXPR_BEG;
|
||||
return kw->id[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (IS_lex_state(EXPR_BEG_ANY | EXPR_ARG_ANY | EXPR_DOT)) {
|
||||
if (cmd_state) {
|
||||
lex_state = EXPR_CMDARG;
|
||||
tokadd(c);
|
||||
tokfix();
|
||||
}
|
||||
else {
|
||||
lex_state = EXPR_ARG;
|
||||
pushback(c);
|
||||
}
|
||||
}
|
||||
else if (lex_state == EXPR_FNAME) {
|
||||
lex_state = EXPR_ENDFN;
|
||||
if (result == 0 && ISUPPER(tok()[0])) {
|
||||
result = tCONSTANT;
|
||||
}
|
||||
else {
|
||||
lex_state = EXPR_END;
|
||||
result = tIDENTIFIER;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
ID ident = TOK_INTERN();
|
||||
if (IS_LABEL_POSSIBLE()) {
|
||||
if (IS_LABEL_SUFFIX(0)) {
|
||||
lex_state = EXPR_LABELARG;
|
||||
nextc();
|
||||
set_yylval_name(TOK_INTERN());
|
||||
return tLABEL;
|
||||
}
|
||||
}
|
||||
if (mb == ENC_CODERANGE_7BIT && !IS_lex_state(EXPR_DOT)) {
|
||||
const struct kwtable *kw;
|
||||
|
||||
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;
|
||||
/* See if it is a reserved word. */
|
||||
kw = rb_reserved_word(tok(), toklen());
|
||||
if (kw) {
|
||||
enum lex_state_e state = lex_state;
|
||||
lex_state = kw->state;
|
||||
if (IS_lex_state_for(state, EXPR_FNAME)) {
|
||||
set_yylval_name(rb_intern(kw->name));
|
||||
return kw->id[0];
|
||||
}
|
||||
if (IS_lex_state(EXPR_BEG)) {
|
||||
command_start = TRUE;
|
||||
}
|
||||
if (kw->id[0] == keyword_do) {
|
||||
if (lpar_beg && lpar_beg == paren_nest) {
|
||||
lpar_beg = 0;
|
||||
--paren_nest;
|
||||
return keyword_do_LAMBDA;
|
||||
}
|
||||
if (COND_P()) return keyword_do_cond;
|
||||
if (CMDARG_P() && !IS_lex_state_for(state, EXPR_CMDARG))
|
||||
return keyword_do_block;
|
||||
if (IS_lex_state_for(state, (EXPR_BEG | EXPR_ENDARG)))
|
||||
return keyword_do_block;
|
||||
return keyword_do;
|
||||
}
|
||||
if (IS_lex_state_for(state, (EXPR_BEG | EXPR_VALUE)))
|
||||
return kw->id[0];
|
||||
else {
|
||||
if (kw->id[0] != kw->id[1])
|
||||
lex_state = EXPR_BEG;
|
||||
return kw->id[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (IS_lex_state(EXPR_BEG_ANY | EXPR_ARG_ANY | EXPR_DOT)) {
|
||||
if (cmd_state) {
|
||||
lex_state = EXPR_CMDARG;
|
||||
}
|
||||
else {
|
||||
lex_state = EXPR_ARG;
|
||||
}
|
||||
}
|
||||
else if (lex_state == EXPR_FNAME) {
|
||||
lex_state = EXPR_ENDFN;
|
||||
}
|
||||
else {
|
||||
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…
Add table
Reference in a new issue