summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-02-09 10:56:24 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-02-09 10:56:24 +0000
commitb814252d728cb08f159da1777feca4f8e9362327 (patch)
treede6617897dbf6bce78045e3fa2ea84ea2422f166 /parse.y
parent1bbcd202e4dab0894bc5ed68ce4ea84dc916980f (diff)
1.1b7 pre
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@67 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y35
1 files changed, 26 insertions, 9 deletions
diff --git a/parse.y b/parse.y
index 1033f60e7a..8a3c2ef9a7 100644
--- a/parse.y
+++ b/parse.y
@@ -210,6 +210,7 @@ static void top_local_setup();
%right kNOT
%nonassoc kDEFINED
%right '=' OP_ASGN
+%right '?' ':'
%nonassoc DOT2 DOT3
%left OROP
%left ANDOP
@@ -694,6 +695,12 @@ arg : variable '=' arg
in_defined = 0;
$$ = NEW_DEFINED($4);
}
+ | arg '?' arg ':' arg
+ {
+ value_expr($1);
+ $$ = NEW_IF(cond($1), $3, $5);
+ fixpos($$, $1);
+ }
| primary
{
$$ = $1;
@@ -975,9 +982,6 @@ primary : literal
}
| kCLASS LSHFT expr term
{
- if (cur_mid || in_single)
- yyerror("class definition in method body");
-
class_nest++;
cref_push();
local_push();
@@ -1257,7 +1261,7 @@ superclass : term
{
$$ = $3;
}
- | error term {yyerrok;}
+ | error term {yyerrok; $$ = 0}
f_arglist : '(' f_args ')'
{
@@ -2307,7 +2311,20 @@ retry:
return parse_qstring(c);
case '?':
- if ((c = nextc()) == '\\') {
+ if (lex_state == EXPR_END) {
+ Warning("a?b:c is undocumented feature ^^;;;");
+ lex_state = EXPR_BEG;
+ return '?';
+ }
+ c = nextc();
+ if (lex_state == EXPR_ARG && space_seen && isspace(c)){
+ pushback(c);
+ arg_ambiguous();
+ lex_state = EXPR_BEG;
+ Warning("a?b:c is undocumented feature ^^;;;");
+ return '?';
+ }
+ if (c == '\\') {
c = read_escape();
}
c &= 0xff;
@@ -2388,6 +2405,7 @@ retry:
return OP_ASGN;
}
if (c == '>') {
+ Warning("-> is undocumented feature ^^;;;");
lex_state = EXPR_BEG;
return KW_ASSOC;
}
@@ -2553,8 +2571,10 @@ retry:
return COLON2;
}
pushback(c);
- if (isspace(c))
+ if (lex_state == EXPR_END || isspace(c)) {
+ lex_state = EXPR_BEG;
return ':';
+ }
lex_state = EXPR_FNAME;
return SYMBEG;
@@ -2588,9 +2608,6 @@ retry:
return c;
case ',':
- lex_state = EXPR_BEG;
- return c;
-
case ';':
lex_state = EXPR_BEG;
return c;