summaryrefslogtreecommitdiffstats
path: root/parse.y
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-03-02 03:21:31 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2005-03-02 03:21:31 +0000
commitbc543f0a1c4d1d7377a4cecaad62a70785f50f00 (patch)
treeeb907e9d068f6f2c6002ab1b92cd78d3326674aa /parse.y
parent77fa77bb04c6ca7fb6ac8fd0e36f152a2ab562fb (diff)
downloadruby-bc543f0a1c4d1d7377a4cecaad62a70785f50f00.tar.gz
ruby-bc543f0a1c4d1d7377a4cecaad62a70785f50f00.tar.xz
ruby-bc543f0a1c4d1d7377a4cecaad62a70785f50f00.zip
* eval.c (rb_eval): [EXPERIMENTAL] NODE_LAMBDA implemented.
[ruby-dev:25780] * node.h (NODE_LAMBDA): for literal Proc object. * parse.y (expr): interpret mere do...end block as proc object. * parse.y (primary): ditto, for brace block. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@8044 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y37
1 files changed, 34 insertions, 3 deletions
diff --git a/parse.y b/parse.y
index 3606060e1..ac1668f7e 100644
--- a/parse.y
+++ b/parse.y
@@ -489,7 +489,7 @@ static void ripper_compile_error _((struct parser_params*, const char *fmt, ...)
%type <node> mrhs superclass block_call block_command
%type <node> f_arglist f_args f_optarg f_opt f_block_arg opt_f_block_arg
%type <node> assoc_list assocs assoc undef_list backref string_dvar
-%type <node> for_var block_var opt_block_var block_par
+%type <node> for_var block_var opt_block_var block_var_def block_par
%type <node> brace_block cmd_brace_block do_block lhs none fitem
%type <node> mlhs mlhs_head mlhs_basic mlhs_entry mlhs_item mlhs_node
%type <id> fsym variable sym symbol operation operation2 operation3
@@ -1014,6 +1014,11 @@ expr : command_call
$$ = dispatch2(unary, ID2SYM('!'), $2);
%*/
}
+ | do_block
+ {
+ $$ = $1;
+ nd_set_type($$, NODE_LAMBDA);
+ }
| arg
;
@@ -2504,6 +2509,26 @@ primary : literal
$$ = dispatch1(hash, escape_Qundef($2));
%*/
}
+ | tLBRACE
+ {
+ /*%%%*/
+ $<vars>$ = dyna_push();
+ $<num>1 = ruby_sourceline;
+ /*%
+ %*/
+ }
+ block_var_def {$<vars>$ = ruby_dyna_vars;}
+ compstmt
+ '}'
+ {
+ /*%%%*/
+ $$ = NEW_LAMBDA($3, dyna_init($5, $<vars>4));
+ nd_set_line($$, $<num>1);
+ dyna_pop($<vars>2);
+ /*%
+ $$ = dispatch2(brace_block, escape_Qundef($3), $5);
+ %*/
+ }
| kRETURN
{
/*%%%*/
@@ -3062,7 +3087,13 @@ block_var : block_par
;
opt_block_var : none
- | '|' /* none */ '|'
+ | block_var_def
+ {
+ $$ = $1;
+ }
+ ;
+
+block_var_def : '|' /* none */ '|'
{
/*%%%*/
$$ = (NODE*)1;
@@ -6380,7 +6411,7 @@ parser_yylex(parser)
if (COND_P()) return kDO_COND;
if (CMDARG_P() && state != EXPR_CMDARG)
return kDO_BLOCK;
- if (state == EXPR_ENDARG)
+ if (state == EXPR_ENDARG || state == EXPR_BEG)
return kDO_BLOCK;
return kDO;
}