diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-04-26 03:42:45 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-04-26 03:42:45 +0000 |
commit | 3cbb849bbbf6088be2c054ee89a6b47f0e39ae99 (patch) | |
tree | ea70504f42b5fd664e35664563ccd4da16f836a0 /parse.y | |
parent | 7a609855dbd00d20fecd8bc76b72b17d41324f19 (diff) |
* parse.y (warn_balanced): warn according to last state.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27498 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 26 |
1 files changed, 13 insertions, 13 deletions
@@ -61,6 +61,7 @@ enum lex_state_e { EXPR_BEG, /* ignore newline, +/- is a sign. */ EXPR_END, /* newline significant, +/- is an operator. */ EXPR_ENDARG, /* ditto, and unbound braces. */ + EXPR_ENDFN, /* ditto, and unbound braces. */ EXPR_ARG, /* newline significant, +/- is an operator. */ EXPR_CMDARG, /* newline significant, +/- is an operator. */ EXPR_MID, /* newline significant, +/- is an operator. */ @@ -1775,12 +1776,12 @@ fname : tIDENTIFIER | tFID | op { - lex_state = EXPR_END; + lex_state = EXPR_ENDFN; $$ = $1; } | reswords { - lex_state = EXPR_END; + lex_state = EXPR_ENDFN; /*%%%*/ $$ = $<id>1; /*% @@ -2964,7 +2965,7 @@ primary : literal | k_def singleton dot_or_colon {lex_state = EXPR_FNAME;} fname { in_single++; - lex_state = EXPR_END; /* force for args */ + lex_state = EXPR_ENDFN; /* force for args */ local_push(0); } f_arglist @@ -6474,7 +6475,7 @@ parser_prepare(struct parser_params *parser) } #define IS_ARG() (lex_state == EXPR_ARG || lex_state == EXPR_CMDARG) -#define IS_END() (lex_state == EXPR_END || lex_state == EXPR_ENDARG) +#define IS_END() (lex_state == EXPR_END || lex_state == EXPR_ENDARG || lex_state == EXPR_ENDFN) #define IS_BEG() (lex_state == EXPR_BEG || lex_state == EXPR_MID || lex_state == EXPR_VALUE || lex_state == EXPR_CLASS) #define IS_SPCARG(c) (IS_ARG() && space_seen && !ISSPACE(c)) @@ -6486,7 +6487,7 @@ parser_prepare(struct parser_params *parser) #define ambiguous_operator(op, syn) dispatch2(operator_ambiguous, ripper_intern(op), rb_str_new_cstr(syn)) #endif #define warn_balanced(op, syn) \ - (lex_state != EXPR_DOT && lex_state != EXPR_FNAME && \ + (last_state != EXPR_DOT && last_state != EXPR_FNAME && \ space_seen && !ISSPACE(c) && \ (ambiguous_operator(op, syn), 0)) @@ -6525,6 +6526,7 @@ parser_yylex(struct parser_params *parser) cmd_state = command_start; command_start = FALSE; retry: + last_state = lex_state; switch (c = nextc()) { case '\0': /* NUL */ case '\004': /* ^D */ @@ -6730,6 +6732,7 @@ parser_yylex(struct parser_params *parser) return '='; case '<': + last_state = lex_state; c = nextc(); if (c == '<' && lex_state != EXPR_DOT && @@ -6793,7 +6796,7 @@ parser_yylex(struct parser_params *parser) case '`': if (lex_state == EXPR_FNAME) { - lex_state = EXPR_END; + lex_state = EXPR_ENDFN; return c; } if (lex_state == EXPR_DOT) { @@ -7394,7 +7397,7 @@ parser_yylex(struct parser_params *parser) CMDARG_PUSH(0); return tLAMBEG; } - if (IS_ARG() || lex_state == EXPR_END) + if (IS_ARG() || lex_state == EXPR_END || lex_state == EXPR_ENDFN) c = '{'; /* block (primary) */ else if (lex_state == EXPR_ENDARG) c = tLBRACE_ARG; /* block (expr) */ @@ -7505,7 +7508,6 @@ parser_yylex(struct parser_params *parser) return '%'; case '$': - last_state = lex_state; lex_state = EXPR_END; newtok(); c = nextc(); @@ -7702,11 +7704,6 @@ parser_yylex(struct parser_params *parser) } } - if (lex_state == EXPR_FNAME) { - const char *p = lex_p, *pe = lex_pend; - while (p < pe && (*p == ' ' || *p == '\t')) p++; - if (p < pe && *p != '(') lex_p = p; - } if ((lex_state == EXPR_BEG && !cmd_state) || IS_ARG()) { if (peek(':') && !(lex_p + 1 < lex_pend && lex_p[1] == ':')) { @@ -7762,6 +7759,9 @@ parser_yylex(struct parser_params *parser) lex_state = EXPR_ARG; } } + else if (lex_state == EXPR_FNAME) { + lex_state = EXPR_ENDFN; + } else { lex_state = EXPR_END; } |