diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2002-07-11 08:24:54 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2002-07-11 08:24:54 +0000 |
commit | fefba453856ff9dfe5ecb0b1e04888c6f14b2383 (patch) | |
tree | e4ac3ce8b1d657c893ce2e79d40ca183e625c846 /parse.y | |
parent | 8e1d1358b689a13b4706754a2ab3fbcd7ef1d683 (diff) |
* string.c (rb_str_slice_bang): if there's no corresponding
substring, slice! should return nil without exception.
* string.c (rb_str_split_m): accept separator value nil as well.
* class.c (include_class_new): module may be T_ICLASS; retrieve
original module information.
* re.c (rb_reg_expr_str): need to process backslashes properly.
* parse.y (yylex): no here document after a dot.
* parse.y (yylex): should have set lex_state properly after '`'.
* parse.y (yylex): should have set lex_state properly after
tOP_ASGN.
* bignum.c (rb_big2dbl): return canonical HUGE_VAL for infinity.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_6@2633 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 64 |
1 files changed, 47 insertions, 17 deletions
@@ -2973,8 +2973,8 @@ yylex() case '*': if ((c = nextc()) == '*') { if ((c = nextc()) == '=') { - lex_state = EXPR_BEG; yylval.id = tPOW; + lex_state = EXPR_BEG; return tOP_ASGN; } pushback(c); @@ -3064,7 +3064,7 @@ yylex() case '<': c = nextc(); if (c == '<' && - lex_state != EXPR_END && lex_state != EXPR_CLASS && + lex_state != EXPR_END && lex_state != EXPR_CLASS && lex_state != EXPR_DOT && (lex_state != EXPR_ARG || space_seen)) { int c2 = nextc(); int indent = 0; @@ -3095,8 +3095,8 @@ yylex() } if (c == '<') { if (nextc() == '=') { - lex_state = EXPR_BEG; yylval.id = tLSHFT; + lex_state = EXPR_BEG; return tOP_ASGN; } pushback(c); @@ -3117,8 +3117,8 @@ yylex() } if (c == '>') { if ((c = nextc()) == '=') { - lex_state = EXPR_BEG; yylval.id = tRSHFT; + lex_state = EXPR_BEG; return tOP_ASGN; } pushback(c); @@ -3130,8 +3130,14 @@ yylex() case '"': return parse_string(c,c,0); case '`': - if (lex_state == EXPR_FNAME) return c; - if (lex_state == EXPR_DOT) return c; + if (lex_state == EXPR_FNAME) { + lex_state = EXPR_END; + return c; + } + if (lex_state == EXPR_DOT) { + lex_state = EXPR_ARG; + return c; + } return parse_string(c,c,0); case '\'': @@ -3144,14 +3150,35 @@ yylex() } c = nextc(); if (c == -1) { - rb_compile_error("incomplete character syntax"); - return 0; - } - if (lex_state == EXPR_ARG && ISSPACE(c)){ - pushback(c); - lex_state = EXPR_BEG; return '?'; } + if (ISSPACE(c)){ + if (lex_state != EXPR_ARG){ + int c = 0; + switch (c) { + case ' ': + c = 's'; + break; + case '\n': + c = 'n'; + break; + case '\t': + c = 't'; + break; + case '\v': + c = 'v'; + break; + } + if (c) { + rb_warn("invalid character syntax; use ?\\%c", c); + } + } + else { + pushback(c); + lex_state = EXPR_BEG; + return '?'; + } + } if (c == '\\') { c = read_escape(); } @@ -3165,6 +3192,7 @@ yylex() lex_state = EXPR_BEG; if ((c = nextc()) == '=') { yylval.id = tANDOP; + lex_state = EXPR_BEG; return tOP_ASGN; } pushback(c); @@ -3199,14 +3227,15 @@ yylex() lex_state = EXPR_BEG; if ((c = nextc()) == '=') { yylval.id = tOROP; + lex_state = EXPR_BEG; return tOP_ASGN; } pushback(c); return tOROP; } if (c == '=') { - lex_state = EXPR_BEG; yylval.id = '|'; + lex_state = EXPR_BEG; return tOP_ASGN; } if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) { @@ -3229,8 +3258,8 @@ yylex() return '+'; } if (c == '=') { - lex_state = EXPR_BEG; yylval.id = '+'; + lex_state = EXPR_BEG; return tOP_ASGN; } if (lex_state == EXPR_BEG || lex_state == EXPR_MID || @@ -3259,8 +3288,8 @@ yylex() return '-'; } if (c == '=') { - lex_state = EXPR_BEG; yylval.id = '-'; + lex_state = EXPR_BEG; return tOP_ASGN; } if (lex_state == EXPR_BEG || lex_state == EXPR_MID || @@ -3513,8 +3542,8 @@ yylex() return parse_regx('/', '/'); } if ((c = nextc()) == '=') { - lex_state = EXPR_BEG; yylval.id = '/'; + lex_state = EXPR_BEG; return tOP_ASGN; } pushback(c); @@ -3534,8 +3563,8 @@ yylex() case '^': if ((c = nextc()) == '=') { - lex_state = EXPR_BEG; yylval.id = '^'; + lex_state = EXPR_BEG; return tOP_ASGN; } switch (lex_state) { @@ -3668,6 +3697,7 @@ yylex() } if ((c = nextc()) == '=') { yylval.id = '%'; + lex_state = EXPR_BEG; return tOP_ASGN; } if (lex_state == EXPR_ARG && space_seen && !ISSPACE(c)) { |