ruby-changes:34762
From: nobu <ko1@a...>
Date: Thu, 17 Jul 2014 13:30:45 +0900 (JST)
Subject: [ruby-changes:34762] nobu:r46845 (trunk): parse.y: parse_qmark
nobu 2014-07-17 13:30:24 +0900 (Thu, 17 Jul 2014) New Revision: 46845 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=46845 Log: parse.y: parse_qmark * parse.y (parse_qmark): extract from parser_yylex(). Modified files: trunk/parse.y Index: parse.y =================================================================== --- parse.y (revision 46844) +++ parse.y (revision 46845) @@ -7185,13 +7185,97 @@ parse_numeric(struct parser_params *pars https://github.com/ruby/ruby/blob/trunk/parse.y#L7185 } static int +parse_qmark(struct parser_params *parser) +{ + rb_encoding *enc; + register int c; + + if (IS_END()) { + lex_state = EXPR_VALUE; + return '?'; + } + c = nextc(); + if (c == -1) { + compile_error(PARSER_ARG "incomplete character syntax"); + return 0; + } + if (rb_enc_isspace(c, current_enc)) { + if (!IS_ARG()) { + int c2 = 0; + switch (c) { + case ' ': + c2 = 's'; + break; + case '\n': + c2 = 'n'; + break; + case '\t': + c2 = 't'; + break; + case '\v': + c2 = 'v'; + break; + case '\r': + c2 = 'r'; + break; + case '\f': + c2 = 'f'; + break; + } + if (c2) { + rb_warnI("invalid character syntax; use ?\\%c", c2); + } + } + ternary: + pushback(c); + lex_state = EXPR_VALUE; + return '?'; + } + newtok(); + enc = current_enc; + if (!parser_isascii()) { + if (tokadd_mbchar(c) == -1) return 0; + } + else if ((rb_enc_isalnum(c, current_enc) || c == '_') && + lex_p < lex_pend && is_identchar(lex_p, lex_pend, current_enc)) { + goto ternary; + } + else if (c == '\\') { + if (peek('u')) { + nextc(); + c = parser_tokadd_utf8(parser, &enc, 0, 0, 0); + if (0x80 <= c) { + tokaddmbc(c, enc); + } + else { + tokadd(c); + } + } + else if (!lex_eol_p() && !(c = *lex_p, ISASCII(c))) { + nextc(); + if (tokadd_mbchar(c) == -1) return 0; + } + else { + c = read_escape(0, &enc); + tokadd(c); + } + } + else { + tokadd(c); + } + tokfix(); + set_yylval_str(STR_NEW3(tok(), toklen(), enc, 0)); + lex_state = EXPR_END; + return tCHAR; +} + +static int parser_yylex(struct parser_params *parser) { register int c; int space_seen = 0; int cmd_state; enum lex_state_e last_state; - rb_encoding *enc; int mb; #ifdef RIPPER int fallthru = FALSE; @@ -7499,83 +7583,7 @@ parser_yylex(struct parser_params *parse https://github.com/ruby/ruby/blob/trunk/parse.y#L7583 return tSTRING_BEG; case '?': - if (IS_END()) { - lex_state = EXPR_VALUE; - return '?'; - } - c = nextc(); - if (c == -1) { - compile_error(PARSER_ARG "incomplete character syntax"); - return 0; - } - if (rb_enc_isspace(c, current_enc)) { - if (!IS_ARG()) { - int c2 = 0; - switch (c) { - case ' ': - c2 = 's'; - break; - case '\n': - c2 = 'n'; - break; - case '\t': - c2 = 't'; - break; - case '\v': - c2 = 'v'; - break; - case '\r': - c2 = 'r'; - break; - case '\f': - c2 = 'f'; - break; - } - if (c2) { - rb_warnI("invalid character syntax; use ?\\%c", c2); - } - } - ternary: - pushback(c); - lex_state = EXPR_VALUE; - return '?'; - } - newtok(); - enc = current_enc; - if (!parser_isascii()) { - if (tokadd_mbchar(c) == -1) return 0; - } - else if ((rb_enc_isalnum(c, current_enc) || c == '_') && - lex_p < lex_pend && is_identchar(lex_p, lex_pend, current_enc)) { - goto ternary; - } - else if (c == '\\') { - if (peek('u')) { - nextc(); - c = parser_tokadd_utf8(parser, &enc, 0, 0, 0); - if (0x80 <= c) { - tokaddmbc(c, enc); - } - else { - tokadd(c); - } - } - else if (!lex_eol_p() && !(c = *lex_p, ISASCII(c))) { - nextc(); - if (tokadd_mbchar(c) == -1) return 0; - } - else { - c = read_escape(0, &enc); - tokadd(c); - } - } - else { - tokadd(c); - } - tokfix(); - set_yylval_str(STR_NEW3(tok(), toklen(), enc, 0)); - lex_state = EXPR_END; - return tCHAR; + return parse_qmark(parser); case '&': if ((c = nextc()) == '&') { -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/