質問に至った背景

Rubyで入力された数の範囲の素数をもれなく求める関数を書いているのですが,なぜか不要なendキーワードを求められます.このendがどこの区切りかわからなかったので質問させていただきました.なお私個人としてはirb(下記ログ参照)でいう33行目のendコード中のendを要求する命令はすべてendで閉じられているため不要だと考えています.

問題のコード
このコードは入力された数の範囲の素数をエラトステネスのふるいではじき出す関数のみを定義してます.

#!/usr/bin/env ruby

def sieve(num);

      n = num;
      array_seed = [];

      while n > 1 do
        array_seed << n;
        n -= 1;
      end

      array_seed.reverse!;
      primes = [];

      while true do
        array_seed_tmp = array_seed.shift;
        primes << array_seed;

           break if !array_seed_tmp

           trashnum = [];

           array_seed.each do |x|
               trashnum << x; if x % array_seed_tmp == 0
           end
         primes -= trashnum
     end
      array_string = primes.to_s;
      array_string.each do |y|
         print("#{y}\s");
      end
    end
end

これの場合irbのチェックが通ります.

psieve.rb(main):001:0> #!/usr/bin/env ruby
=> nil
psieve.rb(main):002:0> 
psieve.rb(main):003:0> def sieve(num);
psieve.rb(main):004:1>   
psieve.rb(main):005:1>       n = num;
psieve.rb(main):006:1>       array_seed = [];
psieve.rb(main):007:1> 
psieve.rb(main):008:1>       while n > 1 do
psieve.rb(main):009:2*         array_seed << n;
psieve.rb(main):010:2>         n -= 1;
psieve.rb(main):011:2>       end
psieve.rb(main):012:1> 
psieve.rb(main):013:1>       array_seed.reverse!;
psieve.rb(main):014:1>       primes = [];
psieve.rb(main):015:1> 
psieve.rb(main):016:1>       while true do
psieve.rb(main):017:2*         array_seed_tmp = array_seed.shift;
psieve.rb(main):018:2>         primes << array_seed;
psieve.rb(main):019:2>          
psieve.rb(main):020:2>            break if !array_seed_tmp
psieve.rb(main):021:2>         
psieve.rb(main):022:2>            trashnum = [];
psieve.rb(main):023:2> 
psieve.rb(main):024:2>            array_seed.each do |x|
psieve.rb(main):025:3*                trashnum << x; if x % array_seed_tmp == 0
psieve.rb(main):026:4>            end
psieve.rb(main):027:3>          primes -= trashnum
psieve.rb(main):028:3>      end
psieve.rb(main):029:2>       array_string = primes.to_s;
psieve.rb(main):030:2>       array_string.each do |y|
psieve.rb(main):031:3*          print("#{y}\s");
psieve.rb(main):032:3>       end
psieve.rb(main):033:2>     end
psieve.rb(main):034:1> end
=> :sieve
psieve.rb(main):035:0> 
psieve.rb(main):036:0> 

しかし33行目(下から4番目)のendを無効にすると構文エラーが起こり出処不明のendを要求されます.

#!/usr/bin/env ruby

def sieve(num);

      n = num;
      array_seed = [];

      while n > 1 do
        array_seed << n;
        n -= 1;
      end

      array_seed.reverse!;
      primes = [];

      while true do
        array_seed_tmp = array_seed.shift;
        primes << array_seed;

           break if !array_seed_tmp

           trashnum = [];

           array_seed.each do |x|
               trashnum << x; if x % array_seed_tmp == 0
           end
         primes -= trashnum
     end
      array_string = primes.to_s;
      array_string.each do |y|
         print("#{y}\s");
      end
    #end
end

psieve.rb(main):001:0> #!/usr/bin/env ruby
=> nil
psieve.rb(main):002:0> 
psieve.rb(main):003:0> def sieve(num);
psieve.rb(main):004:1>   
psieve.rb(main):005:1>       n = num;
psieve.rb(main):006:1>       array_seed = [];
psieve.rb(main):007:1> 
psieve.rb(main):008:1>       while n > 1 do
psieve.rb(main):009:2*         array_seed << n;
psieve.rb(main):010:2>         n -= 1;
psieve.rb(main):011:2>       end
psieve.rb(main):012:1> 
psieve.rb(main):013:1>       array_seed.reverse!;
psieve.rb(main):014:1>       primes = [];
psieve.rb(main):015:1> 
psieve.rb(main):016:1>       while true do
psieve.rb(main):017:2*         array_seed_tmp = array_seed.shift;
psieve.rb(main):018:2>         primes << array_seed;
psieve.rb(main):019:2>          
psieve.rb(main):020:2>            break if !array_seed_tmp
psieve.rb(main):021:2>         
psieve.rb(main):022:2>            trashnum = [];
psieve.rb(main):023:2> 
psieve.rb(main):024:2>            array_seed.each do |x|
psieve.rb(main):025:3*                trashnum << x; if x % array_seed_tmp == 0
psieve.rb(main):026:4>            end
psieve.rb(main):027:3>          primes -= trashnum
psieve.rb(main):028:3>      end
psieve.rb(main):029:2>       array_string = primes.to_s;
psieve.rb(main):030:2>       array_string.each do |y|
psieve.rb(main):031:3*          print("#{y}\s");
psieve.rb(main):032:3>       end
psieve.rb(main):033:2>     #end
psieve.rb(main):034:2> end
psieve.rb(main):035:1> 
psieve.rb(main):036:1> 
SyntaxError (psieve.rb:35: syntax error, unexpected end-of-input, expecting end)
    from /usr/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
    from /usr/bin/irb:23:in `load'
    from /usr/bin/irb:23:in `<main>'

推測
何度も再起動したりRubyを入れ直したりしてみましたがエラーは解決されなかったのでおそらく処理系のエラーバグとは考えにくいので,自分がどこかで書き損じているのだと思います(元々はFedoraでこのような構文解析エラーに遭遇しましたが,緊急用のArchLabsでも同様のエラーが出たので)

伺いたいことを纏めると,

  • 33行目のendはどこのendなのか?

ということです.

最後になりましたが,OSはFedora30とArchLabs(最新版)でRubyのバージョンが共に2.6.3です.