* parse.y (yylex): remove EXPR_CMDARG according to the RHG book.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3425 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2003-01-31 03:15:33 +00:00
parent e13bfb1509
commit f758195486
5 changed files with 31 additions and 27 deletions

View File

@ -82,6 +82,10 @@ Sun Jan 26 03:37:18 2003 Akinori MUSHA <knu@iDaemons.org>
is used with extra arguments given. Tested with FreeBSD and is used with extra arguments given. Tested with FreeBSD and
Linux by me and mswin32, bccwin32 and mingw by usa. Linux by me and mswin32, bccwin32 and mingw by usa.
Sat Jan 25 21:04:57 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
* parse.y (yylex): remove EXPR_CMDARG according to the RHG book.
Fri Jan 24 18:15:33 2003 Yukihiro Matsumoto <matz@ruby-lang.org> Fri Jan 24 18:15:33 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
* parse.y: tMINUS should have lower precedence than tPOW. * parse.y: tMINUS should have lower precedence than tPOW.

View File

@ -490,7 +490,8 @@ set_syserr(n, name)
} }
static VALUE static VALUE
get_syserr(int n) get_syserr(n)
int n;
{ {
VALUE error; VALUE error;

25
parse.y
View File

@ -68,7 +68,6 @@ static enum lex_state {
EXPR_BEG, /* ignore newline, +/- is a sign. */ EXPR_BEG, /* ignore newline, +/- is a sign. */
EXPR_END, /* newline significant, +/- is a operator. */ EXPR_END, /* newline significant, +/- is a operator. */
EXPR_ARG, /* newline significant, +/- is a operator. */ EXPR_ARG, /* newline significant, +/- is a operator. */
EXPR_CMDARG, /* newline significant, +/- is a operator. */
EXPR_ENDARG, /* newline significant, +/- is a operator. */ EXPR_ENDARG, /* newline significant, +/- is a operator. */
EXPR_MID, /* newline significant, +/- is a operator. */ EXPR_MID, /* newline significant, +/- is a operator. */
EXPR_FNAME, /* ignore newline, no reserved words. */ EXPR_FNAME, /* ignore newline, no reserved words. */
@ -3240,7 +3239,7 @@ arg_ambiguous()
rb_warning("ambiguous first argument; make sure"); rb_warning("ambiguous first argument; make sure");
} }
#define IS_ARG() (lex_state == EXPR_ARG || lex_state == EXPR_CMDARG) #define IS_ARG() (lex_state == EXPR_ARG)
static int static int
yylex() yylex()
@ -3464,10 +3463,7 @@ yylex()
return c; return c;
} }
if (lex_state == EXPR_DOT) { if (lex_state == EXPR_DOT) {
if (cmd_state) lex_state = EXPR_ARG;
lex_state = EXPR_CMDARG;
else
lex_state = EXPR_ARG;
return c; return c;
} }
lex_strterm = NEW_STRTERM(str_xquote, '`', 0); lex_strterm = NEW_STRTERM(str_xquote, '`', 0);
@ -3998,10 +3994,7 @@ yylex()
c = tLPAREN; c = tLPAREN;
} }
else if (space_seen) { else if (space_seen) {
if (lex_state == EXPR_CMDARG) { if (lex_state == EXPR_ARG) {
c = tLPAREN_ARG;
}
else if (lex_state == EXPR_ARG) {
c = tLPAREN_ARG; c = tLPAREN_ARG;
yylval.id = last_id; yylval.id = last_id;
} }
@ -4350,7 +4343,7 @@ yylex()
} }
if (kw->id[0] == kDO) { if (kw->id[0] == kDO) {
if (COND_P()) return kDO_COND; if (COND_P()) return kDO_COND;
if (CMDARG_P() && state != EXPR_CMDARG) if (CMDARG_P())
return kDO_BLOCK; return kDO_BLOCK;
if (state == EXPR_ENDARG) if (state == EXPR_ENDARG)
return kDO_BLOCK; return kDO_BLOCK;
@ -4369,14 +4362,8 @@ yylex()
if (lex_state == EXPR_BEG || if (lex_state == EXPR_BEG ||
lex_state == EXPR_MID || lex_state == EXPR_MID ||
lex_state == EXPR_DOT || lex_state == EXPR_DOT ||
lex_state == EXPR_ARG || lex_state == EXPR_ARG) {
lex_state == EXPR_CMDARG) { lex_state = EXPR_ARG;
if (cmd_state) {
lex_state = EXPR_CMDARG;
}
else {
lex_state = EXPR_ARG;
}
} }
else { else {
lex_state = EXPR_END; lex_state = EXPR_END;

View File

@ -214,6 +214,8 @@ rb_f_rand(argc, argv, obj)
} }
vmax = rb_dbl2big(RFLOAT(vmax)->value); vmax = rb_dbl2big(RFLOAT(vmax)->value);
/* fall through */ /* fall through */
case T_BIGNUM:
bignum:
{ {
long len = RBIGNUM(vmax)->len; long len = RBIGNUM(vmax)->len;
double *buf = ALLOCA_N(double, len); double *buf = ALLOCA_N(double, len);
@ -227,6 +229,9 @@ rb_f_rand(argc, argv, obj)
max = 0; max = 0;
break; break;
default: default:
vmax = rb_Integer(vmax);
if (TYPE(vmax) == T_BIGNUM) goto bignum:
case T_FIXNUM:
max = NUM2LONG(vmax); max = NUM2LONG(vmax);
break; break;
} }

View File

@ -892,10 +892,6 @@ rb_str_index_m(argc, argv, str)
pos = rb_reg_search(sub, str, pos, 0); pos = rb_reg_search(sub, str, pos, 0);
break; break;
case T_STRING:
pos = rb_str_index(str, sub, pos);
break;
case T_FIXNUM: case T_FIXNUM:
{ {
int c = FIX2INT(sub); int c = FIX2INT(sub);
@ -908,9 +904,20 @@ rb_str_index_m(argc, argv, str)
return Qnil; return Qnil;
} }
default: default: {
rb_raise(rb_eTypeError, "type mismatch: %s given", VALUE tmp;
rb_class2name(CLASS_OF(sub)));
tmp = rb_check_string_type(sub);
if (NIL_P(tmp)) {
rb_raise(rb_eTypeError, "type mismatch: %s given",
rb_class2name(CLASS_OF(sub)));
}
sub = tmp;
}
/* fall through */
case T_STRING:
pos = rb_str_index(str, sub, pos);
break;
} }
if (pos == -1) return Qnil; if (pos == -1) return Qnil;