fn parse_block(&mut self) -> Result<Option<Box<Node>>, ParseErr> {
        let old_suppress_mul_flag = self.suppress_mul_assign;
        self.suppress_mul_assign = false;
        let do_flag =
            if !self.suppress_do_block && self.consume_reserved_no_skip_line_term(Reserved::Do)? {
                true
            } else if self.consume_punct_no_term(Punct::LBrace)? {
                false
            } else {
                self.suppress_mul_assign = old_suppress_mul_flag;
                return Ok(None);
            };
        // BLOCK: do [`|' [BLOCK_VAR] `|'] COMPSTMT end
        let loc = self.prev_loc();
        self.context_stack.push(ParseContext::new_block(None));

        let params = if self.consume_punct(Punct::BitOr)? {
            self.parse_formal_params(Punct::BitOr)?
        } else {
            self.consume_punct(Punct::LOr)?;
            vec![]
        };

        let body = self.parse_comp_stmt()?;
        if do_flag {
            self.expect_reserved(Reserved::End)?;
        } else {
            self.expect_punct(Punct::RBrace)?;
        };
        let lvar = self.context_stack.pop().unwrap().lvar;
        let loc = loc.merge(self.prev_loc());
        let node = Node::new_lambda(params, body, lvar, loc);
        self.suppress_mul_assign = old_suppress_mul_flag;
        Ok(Some(Box::new(node)))
    }
Parse block.
do |x| stmt end
{ |x| stmt }
ruruby-parse/src/parser.rs