Issue #6115 has been reported by Nobuyoshi Nakada.

----------------------------------------
Bug #6115: A block after the do-block without parenthesis
https://bugs.ruby-lang.org/issues/6115

Author: Nobuyoshi Nakada
Status: Open
Priority: Normal
Assignee: 
Category: core
Target version: 1.9.3
ruby -v: ruby 1.9.3p125 (2012-02-16 revision 34643) [x86_64-darwin11.3.0]


=begin
= ((<pull request 102: A block after the do-block without parenthesis|URL:https://github.com/ruby/ruby/pull/102>))
((<patch|URL:https://github.com/pasberth/ruby/commit/2d6624238aae89110141a8e223f244bf92eb27a9>))

I think seemingly this source code is no problem:

  $ cat unexpected.rb

  langs = ["Ruby"]
  langs.each_with_object [] do |lang, the_langs|
    the_langs << "The #{lang}"
  end.each do |the_lang|
    puts the_lang
  end

But syntax error:

  $ ruby unexpected.rb
  unexpected.rb:4: syntax error, unexpected keyword_do
  end.each do |the_lang|
  ^
  unexpected.rb:5: syntax error, unexpected tIDENTIFIER, expecting keyword_do or '{' or '('

I want to this code behaves like:

  $ cat expected.rb

  langs = ["Ruby"]
  (langs.each_with_object [] do |lang, the_langs|
    the_langs << "The #{lang}"
  end).each do |the_lang|
    puts the_lang
  end

  $ ruby expected.rb
  The Ruby

I changed the block_call in the parse.y to a primary-expression.

  $ ./ruby -I./lib -I. unexpected.rb
  The Ruby

英語に自信がないので日本語でも失礼します。

上の unexpected.rb はぼくには一見なんの問題もなさそうなコードに見えます。
しかしそれは構文エラーです。
ぼくはこのブロックを一次式として扱うべきだと思いました。

=end



-- 
http://bugs.ruby-lang.org/