summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-07-11 08:24:54 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-07-11 08:24:54 +0000
commitfefba453856ff9dfe5ecb0b1e04888c6f14b2383 (patch)
treee4ac3ce8b1d657c893ce2e79d40ca183e625c846 /parse.y
parent8e1d1358b689a13b4706754a2ab3fbcd7ef1d683 (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.y64
1 files changed, 47 insertions, 17 deletions
diff --git a/parse.y b/parse.y
index 302bc5a981..8efd94f509 100644
--- a/parse.y
+++ b/parse.y
@@ -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)) {