summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-07-17 04:30:24 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-07-17 04:30:24 +0000
commitc42029f34a18d7fc4dae846d0b5c424499caaad9 (patch)
tree90c1816460b1606259a72c0e4a8c2135fbf39622 /parse.y
parent9e09b370c1cb15e94137e834e52d0ef00aed59c9 (diff)
parse.y: parse_qmark
* parse.y (parse_qmark): extract from parser_yylex(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46845 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y164
1 files changed, 86 insertions, 78 deletions
diff --git a/parse.y b/parse.y
index 081cb3e291..2f864e597d 100644
--- a/parse.y
+++ b/parse.y
@@ -7185,13 +7185,97 @@ parse_numeric(struct parser_params *parser, int c)
}
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 *parser)
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()) == '&') {