def parse_normal_move
      s0 = @current_pos
      s1 = parse_teban
      if s1 != :failed
        s2 = parse_xy
        if s2 != :failed
          s3 = parse_xy
          if s3 != :failed
            s4 = parse_piece
            if s4 != :failed
              if parse_nl != :failed
                @reported_pos = s0
                s0 = -> (color, from, to, piece) do
                  ret = { "color" => color, "to" => to, "piece" => piece }
                  ret["from"] = from if from["x"] != 0
                  ret
                end.call(s1, s2, s3, s4)
              else
                @current_pos = s0
                s0 = :failed
              end
            else
              @current_pos = s0
              s0 = :failed
            end
          else
            @current_pos = s0
            s0 = :failed
          end
        else
          @current_pos = s0
          s0 = :failed
        end
      else
        @current_pos = s0
        s0 = :failed
      end
      s0
    end
def parse_normal_move
      s0 = @current_pos
      s1 = parse_teban
      if s1 != :failed
        s2 = parse_xy
        if s2 != :failed
          s3 = parse_xy
          if s3 != :failed
            s4 = parse_piece
            if s4 != :failed
              if parse_nl != :failed
                @reported_pos = s0
                s0 = -> (color, from, to, piece) do
                  ret = { "color" => color, "to" => to, "piece" => piece }
                  ret["from"] = from if from["x"] != 0
                  ret
                end.call(s1, s2, s3, s4)
              else
                @current_pos = s0
                s0 = :failed
              end
            else
              @current_pos = s0
              s0 = :failed
            end
          else
            @current_pos = s0
            s0 = :failed
          end
        else
          @current_pos = s0
          s0 = :failed
        end
      else
        @current_pos = s0
        s0 = :failed
      end
      s0
    end
normalmove : teban xy xy piece nl